leetcode刷了600多题啦,最近会放缓刷题速度(具体而言,就是只打周赛),开始看C++相关内容。
该内容近短时间内将持续更新,但本身没啥技术含量,因为只是我个人的笔记而已。
内容:C++ Primer / Effective C++
操作符重载
拷贝赋值操作符,C风格转换赋值操作:
String& operator = (const String& ); String& operator = (const char* );
append操作:
String& operator+=(const String& ); String& operator+=(const char* );
作为类成员的操作符重载符的问题在于,不支持如下语句:
String flower; if(flower == "lily") // ok else if("tulip" == flower) // error
此处,我们希望存在一个操作符,满足左操作数是C风格字符串,右操作数是String类型字符串,但实际上不存在,编译器也不会做隐式转换。(需要查看所有类定义,找到能够把左操作数转换为该类型的构造函数,效率低下)
作为非成员函数的写法:
bool operator == (const String&, const String& ); bool operator == (const String&, const char* );
提供后一种重载的初衷是:考虑到C风格字符串到String类型转换的开销。
以下必须是类成员操作符:
=, [], (), ->
生存期
全局对象:程序启动时分配,程序结束时销毁。
局部本地对象:进入定义的程序块时创建,离开块时销毁。
局部static对象:第一次使用前分配,程序结束时销毁。
动态分配对象:显示释放时销毁。(free store / heap)
shared_ptr类
shared_ptr<string> p1; shared_ptr<list<int>> p2;
默认初始化的智能指针中保存着一个空指针。
RTTI
运行时类型识别:指向基类的指针/引用获取到实际上的类型。
(1) dynamic_cast操作符,安全类型转换。
(2) typeid操作符,可以得到实际派生类型。
应该更多的使用编译时刻类型检查。