- 当基类构造函数需要外部传递参数才能进行初始化时,派生类必须显式定义构造函数,为基类传递参数;基类如果不需要传递或者可以不传递参数,派生类可以不用显式定义构造函数。
- 静态,常量数据成员在类中的初始化(转牛客网评论)
类型 | 类内(声明) | 类外(类实现文件) | 构造函数中 | 构造函数的初始化列表 |
---|---|---|---|---|
非静态非常量数据成员 | N | N | Y | Y |
非静态常量数据成员 | N | N | N | Y(MUST) |
静态非常量数据成员 | N | Y(MUST) | N | N |
静态常量数据成员 | Y | Y | N | N |
以下三种类型必须通过初始化列表来初始化
1.非静态 常量
2. 引用类型
3. 没有默认构造函数的类类型
表格详细描述:
1. 静态常量数据成员可以在类内初始化(即类内声明的同时初始化),也可以在类外,即类的实现文件中初始化,不能在构造函数中初始化,也不能在构造函数的初始化列表中初始化;
2.静态非常量数据成员只能在类外,即类的实现文件中初始化,也不能在构造函数中初始化,不能在构造函数的初始化列表中初始化;
3.非静态的常量数据成员不能在类内初始化,也不能在构造函数中初始化,而只能且必须在构造函数的初始化列表中初始化;
4.非静态的非常量数据成员不能在类内初始化,可以在构造函数中初始化,也可以在构造函数的初始化列表中初始化;
class MyClass
{
public:
MyClass();
~MyClass();
private:
/*类内部*/
int a1 = 0; //非静态非常量数据成员:可在类内声明赋初值
const int a2 = 0; //非静态常量数据成员 :可在类内赋初值
static const int a3 = 0; //静态常量数据成员 :可在类内赋初值
static int a4 = 0; //静态非常量数据成员 :不可在类内赋初值
private:
};
/*类外部*/
int MyClass::a1 = 1; //错误提示:非静态成员不能在其类外部定义
const int MyClass::a2 = 2; //错误提示:非静态成员不能在其类外部定义
const int MyClass::a3 = 3; //正确
int MyClass::a4 = 4; //正确
MyClass::MyClass():a1(1),a2(2) /*初始化列表*/
{
/*构造函数中赋值*/
a1 = 10;
a2 = 10; //错误提示:表达式必须是可修改的左值(a2是常量当然不可修改)
}
MyClass::~MyClass()
{
}
- a++和++a(转牛客网评论)
more effective c++条款六中有写道:
前置式:UPint& UPint::operator++()
{
*this+=1;
return *this;
}
后置式:const UPint UPint::operator++(int)
{
UPint oldvalue=*this;
++(*this);
return oldvalue;
}
很显然后置式是以前置式为基础的,所以前置式快一点。 - 不能被重载的运算符 1、. (成员访问运算符) 2、.* (成员指针访问运算符) 3、:: (域运算符) 4、sizeof(长度运算符) 5、?: (条件运算符)
- 如果一个对象说明为常对象,则通过该对象只能调用它的常成员函数。
- C++支持两种多态性:编译时多态性,运行时多态性。
a.编译时多态性:通过重载函数和运算符重载实现。(静态多态性)
b运行时多态性:通过虚函数和继承实现。(动态多态性) - 纯虚函数格式:virtual <类型> <函数名> (<参数表>) = 0;