【摘要】 序
1、“object” 在“object oriented技术中的真正意义是“物件,物体” 而非 “对象、目标”
导读
1、术语
1)声明式 告诉编译器名称和类型,但略去细节
std::size_t numDigit (int number);
// std命名空间 包含几乎所有c++标准程序库元素,C89标准程序库也适用于c++, 继承自C的符号(eg….
序
1、“object” 在“object oriented技术中的真正意义是“物件,物体” 而非 “对象、目标”
导读
1、术语
1)声明式
告诉编译器名称和类型,但略去细节
std::size_t numDigit (int number);
// std命名空间 包含几乎所有c++标准程序库元素,C89标准程序库也适用于c++, 继承自C的符号(eg. size_t)有可能存在于global 作用域或 std内,或都有,取决于哪个头文件被#include
// size_t 只是一个typedef, 是c++ 计算个数时用的不带正负号(unsigned)类型,也是vector, deque, string内的operator[ ] 函数接收的参数类型。
2)定义式 definition
提供编译器一些声明式所遗漏的细节,对对象来说,定义式是编译器为此对象分配内存的地点,对function, function template而言,定义式提供了代码本体;对class, class template而言,定义式列出了成员
3) 初始化 initialization
- default构造函数可被调用但不带任何实参,要么没参数,要么每个参数有缺省值
- explicit :阻止函数被用来执行隐式类型转换,但仍可显式转换
4)copy构造函数:以同型对象初始化自我对象 –> 定义一个对象pass by value
copy assignment操作符:从另一个同型对象中拷贝其值到自我对象
区分:新对象被定义,一定会调构造函数 eg. Widgt w3 = w2;
2、命名习惯
1)两个参数名称
- lhs: left-hand-side 左手端
- rhs: right-hand-side 右手端
对于成员函数,左侧实参由this指针表现出来,eg. 见上一幅图,所以单独使用参数名rhs
3、TR1和Boost
一、让自己习惯C++
条款01:视c++为一个语言联邦
- C: pass-by-value更高效
- Objected-Oriented C++: 由于用户自定义的构造函数和析构函数的存在,pass-by-reference-to-const更好
- Template C++: 泛型编程
- STL: template程序库:容器、迭代器、算法、函数对象,迭代器&函数对象都是在c指针之上塑造出来的,所以pass-by-value守则适用。
条款02:尽量以const, enum, inline替换 #define
1、宁可以编译器替换预处理器
// 该名称会被预处理器移走,编译错误或debug时追踪不到该记号
// 作为语言常量,会被编译器看到,也会进入记号表
2、宏看起来像函数,但不会招致函数调用带来的额外开销,不要用#define实现形似函数的宏===>使用template inline函数
3、对于单纯常量,最好改用 inline函数替换 #defines
条款03:尽可能使用const
const出现在星号左边,表示物是常量;出现在星号右边,表示指针自身是常量
mutable
关键字,使成员变量即使在const成员函数内也能被修改- 若函数返回类型是个内置类型,改动函数返回值从来就不合法,即使合法,c++以by value返回对象改动的其实是副本,不是本身。
- const 成员函数承诺绝不改变其对象的逻辑状态
- 在const和 non-const 成员函数中避免重复: non-const 成员函数调用 const 成员函数
const_cast :从const operator[ ]的返回值中移除const
条款04:对象使用前初始化
-
确保每一个构造函数都将对象的每一个成员初始化
-
区分赋值(assignment)和初始化:
对象的成员变量的初始化动作发生在进入构造函数本体之前, default构造函数被自动调用之时—> 使用初始化列表(member initialization list)
-
总是在初值列中列出所有成员变量
-
总是使用成员初值列(最好做法),即使内置类型初始化和赋值成本相同
-
成员变量是const 或 references 就一定需要初值,不能被赋值
-
成员初始化次序:base classes—derived classes, 而class的成员变量按声明次序初始化
-
跨编译单元的初始化次序问题:以local static对象替换non-local static
========
static对象:寿命从被构造到程序结束,main()结束时析构函数自动调用,销毁对象
local static对象: 只包括函数内的static对象
non-local static对象:global、namespace内、classes内、file作用域内被声明为static的对象
二、构造/析构/赋值运算
条款05:c++默默编写调用了哪些函数
- c++不允许让reference改指向不同对象
- 若想在一个内含reference 、const 成员的class内支持赋值操作,必须自己定义copy assignment操作符
条款06:明确拒绝不想使用的编译器自动生成的函数
- 将相应的函数声明为private 并且不予实现。或使用一个专门的 base class
条款07:为多态基类声明virtual析构函数
-
带多态性质的base classes应该声明一个virtual 析构函数。
-
若class 带有任何virtual 函数,就应该拥有一个virtual析构函数。
-
其余情况classes 不该声明
-
只想在程序中使用时间,不想操心时间如何计算等细节,可设计一个
工厂函数
,返回指针指向一个计时对象 ——> 返回一个base class指针,指向新生成之derived class 对象
条款08:别让异常逃离析构函数
- 析构函数绝对不要吐出异常,否则可能“过早结束程序” 或 “发生不明确行为”, 若一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后
吞下
他们(不传播)或结束程序std::abort
try {} catch { 制作运转记录,记下对close 的调用失败 }
- 若客户需要对某个操作函数运行期间抛出的异常做出反应,那么class 应该提供一个普通函数(而不是在析构函数中)执行该操作
条款09:绝不在析构和构造过程中调用virtual函数
原因:
- 基类构造函数的执行早于继承类。当 base class构造函数执行时,derived class的成员变量尚未初始化,若基类构造函数中有一个纯虚函数,则创建子类对象时先被调用的是父类的版本,而不是子类的重新实现版本。
- base class构造期间virtual函数绝不会下降到derived class阶层———即,在base class 构造期间,virtual函数不是virtual 函数
条款10:令operator=返回一个reference to *this
eg. int x= y = z = 5; 为实现连锁赋值,赋值操作符返回类型是个reference,指向当前对象(操作符的左侧实参)
class Widget{
public:
...
Widget& operator=(const Widget& rhs)
{
...
return* this; //返回左侧对象
}
...
};
条款11:在operator=中处理自我赋值
-
别名:有一个以上的方法指称某对象,事实上,两个对象只要来自同一个继承体系,甚至不需声明为相同类型就可能造成 “别名”,因为基类的指针或reference可以指向一个继承类对象
-
自我赋值安全
-
异常安全性
-
确定任何函数操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然是正确的。
条款12:复制对象时勿忘其每一个成分
- copying函数确保:
- 复制对象内所有成员变量
- 调用所有base class内的适当的copying函数
- 若copy构造函数和copy assignment操作符有相近的代码—>建一个新的成员函数给两者调用(通常是private,且常被命名为 init),不能用某个copying函数实现另一个copying函数
三、资源管理
条款14:以对象管理资源
- 为防止资源泄露,使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源
class Investment {...};
Investment* createInvestment(); /工厂函数,供应Investment对象
/返回指针,指向Investment继承体系内的动态分配对象,调用者有责任删除它
- 两个常被使用的RAII class是:
auto_ptr: 受其管理的资源不能有一个以上的auto_ptr同时指向它(不然对象会被删除一次以上)——–若被复制,会变成null, 而复制所得的指针将取得资源唯一拥有权
tr1::shared_ptr:引用计数型智能指针,追踪共有多少对象指向某笔资源,在无人指向时自动删除该资源——复制行为正常
文章来源: blog.csdn.net,作者:会变强的小魔女,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/CSDN_09/article/details/112277768