一、对象的创建和销毁过程
1、对象的创建过程
a、给对象划分内存空间(栈、堆)
b、执行初始化列表
根据继承表顺序调用父类的构造函数,也可以调用有参构造,类名(参数)
根据成员的定义顺序调用类类型成员的无参构造函数,也可以调用有参构造,成员名(参数)
初始化其它成员
c、执行构造函数,申请资源
2、对象的销毁过程
a、执行析构函数,释放资源
b、根据成员的定义逆序调用类类型成员的析构函数
c、根据继承表顺序逆序调用父类的析构函数
d、释放对象的内存
成员函数是如何区别调用它的对象
1、对象的内存只存储了它的成员变量,没有存储成员函数指针
2、当通过对象调用成员函数时,编译器会自动把对象的地址传递给它的成员函数,也就是说成员函数有一个隐藏的参数,这个参数名就是 this 指针
3、this 指针虽然是隐藏的,但也可以显式使用
常用成员
1、被 const 修饰过的成员函数,叫常函数
2、已知当通过对象调用成员函数时,编译器会把对象的地址隐式传递给成员函数
3、如果对象被 const 修饰过,就不能调用普通成员函数了,编译器报错;因为此传递的对象地址带 const 属性,而普通的成员函数隐藏式的 this 指针不带 const 属性,也就是把 const 属性的指针赋值给不带 const 属性的指针变量,编译器不允许
4、如果成员函数被 const 修饰,其实是修改隐式的 this 指针,这样 this 也就具备了 const 属性,就可以被 const 属性对象调用了
5、const 属性的对象只能调用常函数,常函数也只能调用常函数
(普通函数可以调用常函数,常函数不可以调用普通函数)
6、在常函数中不能修改成员变量,除非该成员变量被 mutable 修饰
问题
1、C语言中的 const 与 C++ 的 const 有什么不同?
1、C语言和 C++的 const 用来保护数据,不同的是 C++会优化 const 变量的取值过程,哪怕 const 变量的内存被强行修改,也不会改变 const 变量的值,这样的处理机制安全性更高
2、在 C++中 const 还可以用来修饰成员函数(给隐藏和 this 指针增加 const 属性),定义常函数
2、一个空的结构体对象在 C 语言中和 C++ 中占多少个字节,为什么?
在 C语言中占0个字节,而在 C++中占有1个字节
在 C++中结构体可以定义成员函数,且有默认的四个成员(构造、析构、拷贝、赋值),调用通过结构对象调用成员函数时会把对象的地址自动传递给成员函数,这种机制就要求结构对象在内存中必须拥有一席之地,所以当结构没有成员时,编译器也会让结构至少拥有1字节内存