一、对象的创建和销毁过程
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、在常函数中不能修改成员变量,除非该成员变量被 mutalbe 修饰。
面试题
1、C语言中的const与C++的const有什么不同
C语言和C++的const都是用来保护数据
1、不同的是C++会优化const变量的取值过程,哪怕const变量的内存被强行修改也不会改变const变量的值,这样的处理机制安全性更高
2、在C++中const还可以用来修饰成员函数(给隐藏的this指针增加const属性),定义常函数
2、一个空的结构体对象在C语言中和C++分别占多少个字节为什么?
在C语言中占0个字节,而在C++中占1个字节
1、在C++中结构体可以定义成员函数,且有默认的四个成员函数(构造、析构、拷贝、赋值),当通过结构对象调用成员函数时,会把对象的地址自动传递给成员函数,这种机制要求结构对象在内存中必须拥有一席之地,所以当结构没有成员时,编译器会让结构至少拥有1字节内存