1、类成员初始化
若使用编译器自动生成的默认构造函数初始化,则类中每一个成员,使用以下规则来初始化:
1)类成员运行其默认构造函数初始化;
2)内置成员或者复合型成员的初始化依赖于作用域(和普通变量相同,例如全局int初始化为0,局部string也自动初始化为空)。
2、复制构造函数
string null_book = "9-99-9"
先创建了一个临时string变量,然后使用复制构造函数创建null_book 。值得注意的是,很多编译器能将以上语句等价于string null_book ("9-99-9")
,跳过复制构造函数直接调用普通构造函数创建对象。,这是编译器做了优化的结果。
3、不可重载的运算符
:: .* . ?:
它们的共同点是,带有点号
4、如何限制栈对象的生成,如何限制堆对象的生成
产生堆对象的唯一方法是使用new操作,通过禁止使用new,(重载new和delete运算符,并设为private),即可禁止产生堆对象。
将构造函数,析构函数设为private,系统就不能再栈内生成对象了。
5、虚函数的访问
1)通过对象名访问虚函数,无法动态联编,调用该类本身方法;
2)通过指针访问虚函数,动态联编;
3)通过引用访问虚函数,与指针访问类似,但是一经绑定,无法修改指向,可提高访问的安全性,又称为“受限指针”。
6、RTTI
Runtime Type Identification RTTI通过运行时类型识别,程序能够使用基类的指针或引用来检索这些指针或引用所指向的对象的实际类型。
1)typeid操作符返回指针或引用所指向的实际类型
2)dynamic_cast将基类类型的指针或引用安全转换为派生类的指针或引用。
7、cast
1)static_cast:编译器执行的隐式转换都可以用static_cast显示完成;
double d = 97.0;
int i = static_cast<int>(d);
2)const_cast:转换掉const性质,只有添加或删除const时可用,否则编译出错;
const char * p;
char * pc = const_cast<char *>(p);
3)reinterpret_cast:C++指针间不支持隐式转换,需要显式强制转换;
int * pint;
char * pc = reinterpret<>char*>(pint);//与圆括号强转功能相同
4)dynamic_cast:运行时类型检查,将基类类型的指针或引用安全转换为派生类的指针或引用。
8、容器使用要求
容器元素类型需要满足以下两个约束:
1)元素类型必须支持赋值运算
2)元素类型的对象必须可以复制
除引用类型外,所有内置或复合类型都可以用作容器的元素类型。引用不支持一般意义的赋值运算,因此没有元素是引用的容器。
9、new异常
new在失败后,抛出标准异常,std::bad_alloc而不是返回nullptr
网友评论