effective c++ 条款总结(1)

本文总结了Effective C++的部分条款,强调使用const对象或enums替代#define,采用inline函数替换宏,充分利用const特性。还讨论了构造函数的成员初值列、编译器生成的特殊成员函数、拒绝编译器自动功能的方法,以及virtual函数和析构函数的正确使用。此外,避免在构造函数中调用virtual函数,确保copy函数完整地处理所有成员,并防止异常传播。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 对于单纯常量,最好以const对象或enums替换#defines
  2. 对于形似函数的宏,最好改用inline函数替换#defines
  3. 尽量使用const
std::vector<int> vec;
// 注意下面的比较
const std ::vector<int>::iterator iter = vec.begin();
*iter = 10; //正确,iter相当于T* const
++iter; //错误,iter本身不能改变

const std ::vector<int>::const_iterator citer = vec.begin();
*citer = 10; //错误,citer相当于const T*
++citer; //正确,citer本身能被改变

const是指不更改对象内的任何一个bit,所以const成员函数不能更改对象内任何非static的成员变量。

//
class CT {
public:
	std::size_t length() const;
private:
	char* p;
	std::size_t = tlength;
	mutable bool lengthIsValid;
};
std::size_t CT::length() const{
	if(!lengthIsValid){
		tlength = std::strlen(p); //错误,const成员函数内不能被改变
		lengthIsValid = true; //正确,要改变除非加上mutable关键字
	}
}

常量性转移解决常量调用和非常量调用。

// 发生了两次转换:第一次是为*this添加const调用const op[]版本,第二次是从const op[]的返回值中移除const
// static_cast安全,但const_cast存在安全隐患
class CT {
public:
	const char& operator[] (std::size_t position) const {
		return text[position];
	}
	char& operator[] (std::size_t position){
		return const_cast<char&>(static_cast<const CT&>(*this)[position]);
	}
};
  1. 构造函数最好使用成员初值列,而不要在构造函数的本体内使用赋值操作。如果有出现跨编译单元的初始化次序问题,要使用local static。
  2. 编译器可以自己为class创造默认构造函数,拷贝构造函数,赋值构造函数和析构函数。
  3. 将相应的成员函数声明为private并且不要去实现它,可以驳回编译器自动提供的功能(比如赋值,拷贝等)。
  4. 任何类只要带有virtual函数都几乎确定应该也有一个virtual析构函数。给基类一个virtual析构函数只适用于多态性质的基类。
  5. 析构函数不要突出异常。
  6. 在构造函数内对对象调用virtual函数是一种错误的做法。
    10.copy函数应该赋值对象内所有的成员变量,包括基类部分,同时不要以某个copy函数去实现另外一个copy函数,应该放进第三个函数中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值