好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
答:这种函数会自动为内联函数,这种函数在函数调用的地方在编译阶段都会进行代码替换。
A()
A(const A&) //默认拷贝构造函数,如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数
~A() //默认析构函数
A& operator = (const A &) //默认赋值函数,重载的赋值运算符
对象不存在,且没用别的对象来初始化,就是调用了构造函数;
对象不存在,且用别的对象来初始化,就是拷贝构造函数
对象存在,用别的对象来给它赋值,就是赋值函数。
其中只有默认赋值函数最复杂,该函数的实现如下:
Test & operator=(const Test &obj)
{
if(this !=&obj)
{
data=y.data;
}
return *this;
}
答:当构造函数涉及到动态存储分配空间时,要自己写拷贝构造函数,并且要深拷贝。
1.当类的一个对象去初始化该类的另一个对象时;
2.如果函数的形参是类的对象,调用函数进行形参和实参结合时;
3.如果函数的返回值是类对象,函数调用完成返回时。
1.先调用基类构造函数
2.按声明顺序初始化数据成员
3.最后调用自己的构造函数体。
一、在有些情况下,必须使用初始化列表。特别是const和引用数据成员被初始化时,因为他们不能被赋值
二、是从效率方面来说的,对于内置类型或复合类型,差异不会太大,但对于非内置数据类型,差异还是很明显的,因为其执行了:一次初始化 + 一次赋值
类的成员是常量成员初始化;
类的成员为引用时。
类的成员是对象成员初始化,而该对象没有无参构造函数。
友元(如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend),
继承
公有成员函数。
.*(成员指针访问运算符号)
::域运算符
Sizeof 长度运算符号
?:条件运算符号
.(成员访问符)
答:它的次序完全不受它们在初始化表中次序的影响,只有成员对象在类中声明的次序来决定的。
答:
virtual修饰符会被隐形继承的。
virtual可加可不加,子类覆盖它的函数不加virtual ,也能实现多态。