首页 > 代码库 > 构造函数
构造函数
---------------siwuxie095
关于类和对象的思考:
(1)实例化的对象是如何在内存中存储的?
(2)类中的代码又是如何存储的?
(3)代码和数据又有怎样的关系?
对象结构
要想说清对象是如何存储的,必须先了解内存中按照用途被划分的 5 个区:
(1)栈区
定义的变量存储在栈区,其特点为:内存由系统进行控制,无论是分配
还是回收,都不需要程序员来关心
(2)堆区
如果分配内存时使用 new 运算符,则 new 出的内存存储在堆区,未来
必须使用 delete 来回收
(3)全局区
存储全局变量和静态变量
(4)常量区
存储字符串和常量
(5)代码区
存储编译之后的二进制代码
如:定义一个汽车类
在该类被实例化之前,不会占用栈 或堆中内存,但当它实例化之后,
每个对象都会在栈上开辟出一段内存,用来存储各自的数据,它们是
不同的变量,占据着不同的内存,而逻辑代码只编译出了一份,放在
代码区,代码区中的代码供所有的对象使用,谁需要它就去调用它,
找到相应的代码入口即可
注意:
当实例化 3 个对象后,每个对象中的数据都是不可控的,都是未知的,
因为没有对这些数据进行初始化
如果没有初始化,就无法对这些数据进行预想的逻辑操作,
显然,必须对数据进行初始化
对象初始化
如:坦克大战中坦克出现位置的初始化
对于对象的初始化来说,不同的场合,有些只需要初始化一次,有些则要
根据条件初始化多次
初始化函数如何避免误操作而给程序带来的可能的灭顶之灾
为了帮助程序员避开这些风险,C++ 推出了构造函数:
(1)构造函数最大的特点 即 在对象实例化时被自动调用,通常只需要将
初始化的代码写在构造函数内,就能起到初始化数据的作用了。需要强调
的是,构造函数在实例化对象时被调用且仅被调用一次
(2)定义构造函数时,构造函数的名字要和类名同名
(3)构造函数也没有返回值
(4)构造函数可以进行重载
(5)实例化对象时,即便有多个构造函数,也仅用到其中一个构造函数
(6)当用户没有定义构造函数时,编译器将自动生成一个构造函数,
其中没有做任何的事情,为空
如:无参构造函数
再如:有参构造函数
再如:重载构造函数
程序:
Teacher.h:
#include <string> using namespace std;
class Teacher { public: //无参构造函数 Teacher(); //有参构造函数,这里给age了一个默认值20 若name也给默认值 //则t1在实例化时就不知道该调用哪个构造函数,就不能通过编译 Teacher(string name, int age = 20); void setName(string name); string getName(); void setAge(int age); int getAge(); private: string m_strName; int m_iAge; }; |
Teacher.cpp:
#include "Teacher.h" #include <iostream> using namespace std;
Teacher::Teacher() { m_strName = "Jim"; m_iAge = 5; cout << "Teacher()" << endl; }
Teacher::Teacher(string name, int age) { m_strName = name; m_iAge = age; cout << "Teacher(string name, int age)" << endl; }
void Teacher::setName(string name) { m_strName = name; }
string Teacher::getName() { return m_strName; }
void Teacher::setAge(int age) { m_iAge = age; }
int Teacher::getAge() { return m_iAge; } |
main.cpp:
#include<stdlib.h> #include "Teacher.h" #include<iostream> #include <string> using namespace std;
int main(void) { Teacher t1; Teacher t2("Merry", 15); Teacher t3("James"); cout << t1.getName() << " " << t1.getAge() << endl; cout << t2.getName() << " " << t2.getAge() << endl; cout << t3.getName() << " " << t3.getAge() << endl; system("pause"); return 0; } |
【made by siwuxie095】
构造函数