
Effective C++
文章平均质量分 57
如果你没看过EffecitiveC++却认为自己对C++无所不知,恐怕你得三思。
W2155
这个作者很懒,什么都没留下…
展开
-
条款12:复制对象时勿忘记复制其每一个成分
public:{}private:在成员变量中,新增一个Transaction变量,切记要修改,构造函数和拷贝构造,如果不新增编译器不会报错,很难令人察觉。原创 2024-03-19 15:40:33 · 261 阅读 · 0 评论 -
条款13:用对象管理资源(智能指针)
来看看吧,没有收获把我腿打断。原创 2024-03-18 00:01:54 · 340 阅读 · 0 评论 -
条款11:operator=中处理自我赋值
相比第一种写法,这种写法的效率更高,判断是需要成本的,会使代码变大,引入一个新的控制流分支,二者都会降低运行速度。Widget&Widget::operator=( Widget rhs)//利用函数传值,是对原值的拷贝。正常来说自我赋值是一个很愚蠢的行为,但是有一些自我赋值其实是不太容易察觉的。swap(rhs);//将rhs和*this的数据交换。这种自我赋值会引起引起申请的资源在没有被使用完,就被释放的错误。*px = *py //px py指向同一块内容就是自我赋值。//不安全的operator。原创 2024-03-16 23:07:53 · 414 阅读 · 0 评论 -
条款09:绝不在析构和构造中调用virtual函数
上述代码的本意是,每当进行买入或卖出时,都会创建买入的操作日志或者卖出的操作日志但是当BuyTransaction对象b创建的时候,会先调用Transaction的构造函数,构造函数去调用logTransaction(),因为这个时候BuyTransaction对象的成员全部未初始化,如果调用BuyTransaction的成员函数,势必要使用BuyTransaction的成员变量,使用未初始化的变量,C++肯定会制止这种行为。原创 2024-03-16 22:25:32 · 300 阅读 · 0 评论 -
条款07:为多态基类声明virtual析构函数
声明为虚函数,结构中会多存一个虚表指针vptr,在64bit的机器上,如果有两个对象是两个int+vptr可能会占用64~128bit,使其不能直接塞入64-bit的缓存器。我们用一个基类的指针,指向一个派生类的对象,这个时候,对基类的指针执行delete,会出现只有基类的部分删除,造成内存泄漏。加上virtual之后就会变成多态调用,调用delete会调用派生类的析构函数,再调用基类的析构函数。加上虚表指针之后,C++的对象,不在和其他语言具有相同的结构,因为其他语言没有虚表指针。原创 2024-03-12 23:09:22 · 417 阅读 · 0 评论 -
条款06:若不想使用编译器自动生成的函数应该明确拒绝
但是成员函数和友元函数还是可以调用,拷贝构造,如果你不去定义,他会报一个链接错误。原创 2024-03-12 15:16:35 · 200 阅读 · 0 评论 -
条款05:了解C++默默编写了并调用那些函数
当你定义一个空类C++会自动为你生成默认构造函数,拷贝构造函数,赋值运算符重载,析构函数。这些函数都是public且inline//经过C++处理后//默认构造//拷贝构造//赋值运算符重载//析构函数这些函数只有在被调用的时候才会实例化出来。当成员变量有&和const时编译器拒绝为其生成赋值运算符重载。原创 2024-03-06 21:55:37 · 195 阅读 · 0 评论 -
条款 04:确定对象在使用之前已经被初始化
自定义类型的初始化责任落在,构造函数身上,构造函数要把对象的每一个成员都初始化。不要混淆初始化和赋值public:PhoneNumber(const string &name, const string &adress)//构造函数//赋值并非初始化//赋值并非初始化private:虽然这样仍然会得到你想要的初始值,并非是最佳做法。C++规定,成员变量的初始化应该在进入构造函数之前。原创 2024-03-05 12:19:57 · 289 阅读 · 0 评论 -
条款03:尽可能使用const
/在a * b的结果上调用operator=这个是一个无意义的行为,内置类型也不支持这样操作,在运算符重载的时候,要于内置类型一致。一个更改了指针所指物,成员函数不能算作const,但是如果所指物,不隶属于对象,称为physical constness。只需要在成员变量的前面加上mutable(可修改的)就可以释放physical constness的约束。如果一个函数返回值是不需要改动的,一定要加上const,防止用户未确定的行为。迭代器是由指针塑模出来了,修饰迭代器就相当于修饰指针本身。原创 2024-03-04 16:35:40 · 693 阅读 · 0 评论 -
条款02:尽量以const,enum,inline代替#define
原因:1.#define是在预处理阶段,直接将代码中的B替换为1.63会产生多份,而常量不会产生这样的情况。2.当你用#define出现错误时后,编译器可能会提到1.63,不会提到B,如果1.63来自头文件,还需要去头文件去追踪。原创 2024-02-29 22:58:41 · 472 阅读 · 0 评论