
C++
文章平均质量分 79
C++知识
myepicure888
这个作者很懒,什么都没留下…
展开
-
《Effective C++》知识点(9)--杂项讨论
54.3 TR1自身只是一份规范,为获得TR1提供的好处,你需要取得实现代码。Boost程序库包含。53.1 严肃对待编译器发出的警告信息。努力在你的编译器的最高警告级别下争取"无任何警告"。53.2 不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。在忽略某个警告之前,请确保你了解它意图说出的精确意义。到另一个编译器上,你原本依赖的警告信息有可能消失。是个template,以其目标函数的签名(指明参数和返回值类型)为参数。54.1 C++98标准库。55.2 Boost组件。原创 2023-11-14 14:58:19 · 135 阅读 · 0 评论 -
《Effective C++》知识点(8)--定制new和delete
52.2 当你声明placement new和placement delete,请确保没有掩盖它们的正常版本(条款33)。d. 抛出bad_alloc(或派生自bad_alloc)的异常(不被operator new捕捉)。b. 类的专属版本应该能处理"与正确大小不一致的(错误)"申请(交给标准operator delete)。c. 类的专属版本应该能处理"与正确大小不一致的(错误)"申请(交给标准operator new)。期多态(静态多态),其中基类A用来定义(暴露)接口,派生类X用来实现这些接口。原创 2023-11-13 09:12:17 · 112 阅读 · 0 评论 -
《Effective C++》知识点(7)--模板与范型编程
46.1 在template实参推导过程中从不将隐式类型转换函数纳入考虑。46.2 template class内的friend声明式可以指涉某个特定函数。使用friend是目的是支持"所有参数的隐式类型转换"。46.3 为了让类型转换可能发生于所有实参身上,我们需要一个非成员函数;为了令这个函数被自动具现化,我们需要将它声明在class内部;而在class内部声明非成员函数的唯一办法就是令它为friend。这里使用friend与它的传统用途"访问class内非public成分"没有关系。原创 2023-11-10 10:53:17 · 113 阅读 · 0 评论 -
《Effective C++》知识点(6)--继承与面向对象设计
任何情况下继承类都不该重新定义一个继承而来的基类non-virtual函数。如果需要重新定义,那说明这个函数其实应该是virtual函数。37.1 可以重定义继承而来的带有缺省参数值的virtual函数实现,但不能重定义它的缺省参数值。因为virtual函数是动态绑定,而缺省参数值却是静态绑定。37.2 为什么缺省参数值是静态绑定?为了运行效率。如果缺省参数值是动态绑定,编译器就必须有某种办法在运行期为虚函数决定适当的参数缺省值。这比目前实行的"在编译期决定"的机制更慢而且更复杂。为了。原创 2023-11-04 17:32:57 · 170 阅读 · 0 评论 -
《Effective C++》知识点(5)--实现
26.1 "尽可能延后"的真正意义是:你不只应该延后变量的定义,直到非得使用该变量的前一刻 为止,甚至应该尝试延后这份定义直到能够给它初值实参为止。a. 提高了程序效率。不仅避免了构造和析构非必要对象,还可以避免无意义的default构造。b. 提高了代码清晰度。以"具有明显意义之初值"将变量初始化,还可以附带说明变量的目 的。26.2 对于循环,对象是应该定义在循环外还是循环内?原创 2023-10-31 17:09:40 · 99 阅读 · 0 评论 -
《Effective C++》知识点(4)--设计与声明
25.1 当std::swap对你的类型效率不高时,提供一个public的swap成员函数,并确保这个函数不抛出异常。18.3 "阻止误用"的办法包括建立新类型、限制类型上的操作(什么事可做,什么事不能做)、限制对象值、以及消除客户的资源管理责任。18.2 "促进正确使用"的办法包括接口的一致性,以及与内置类型的行为兼容(尽量令你的types的行为与内置types一致)。21.1 当你必须在"返回一个引用"和"返回一个对象"之间选择时,你的工作就是挑出行为正确的那个,剩下的交给编译器。原创 2023-10-28 20:55:21 · 168 阅读 · 0 评论 -
《Effective C++》知识点(3)--资源管理
16.2 如果在new表达式中没有使用[],一定不要在相应的delete中使用[],否则可能删除不属于它的内存,造成不可预测的结果。std::tr1::shared_ptr应优先选择,它是引用计数智能指针(RCSP),可以多个指向同一对。16.1 如果在new表达式中使用[],必须在相应的delete表达式中也使用[],否则内存泄漏。d. 转变底层资源的拥有权,确保只有一个RAII对象指向资源,如auto_ptr。缺点是无法打破环状引用(如两个没用的对象彼此互指),这点需要注意。原创 2023-10-25 10:03:24 · 148 阅读 · 0 评论 -
《Effective C++》知识点(2)--构造/析构/赋值运算
9.1 构造函数的调用顺序是,先调基类构造,再调继承类构造。在基类构造函数中调用虚函数,此时继承类尚未构造,其成员变量也没有初始化,所以此时对象还是基类对象,基类构造函数里调用的其它函数,只能是基类定义的函数。基类析构函数里调用的其它函数,只能是基类定义的函数。5.3 编译器拒绝生成operator=函数的情况:一是有引用成员变量,二是有const成员变量,三是基类的operator=函数是私有的。如果这个类有基类,且基类析构函数是virtual的,这时它的析构函数才是virtual的。原创 2023-10-23 16:39:43 · 104 阅读 · 0 评论 -
《Effective C++》知识点(1)--让自己习惯C++
但是C++保证,函数内的local static对象会在"该对象被调用期间"首次遇上该对象定义式时被初始化。所以请优先使用局部静态对象函数,而不是全局静态对象,可以避免依赖的静态对象未被初始化的情况。3.4 当const和non-const成员函数有着实质等价的实现时,另non-const版本调用const版本可以避免代码重复。先用static_cast将*this转为const对象调用const成员函数,再用const_cast移除调用返回的const修饰。处理的,编译器不知道它的存在。原创 2023-10-21 16:39:03 · 148 阅读 · 0 评论 -
C++11新特性(5):多线程
自旋锁是一种忙等待形式的锁,会在用户态不停的询问锁是否可以获取(获取不到一直循环),不会陷入到内核态中,所以更加高效,但是可能会对CPU资源造成浪费。这样,在lambda表达式执行结束后,变量a已经被销毁,但后台运行的线程仍然在使用已销毁变量a的指针,因此后面输出的值都是错误的。条件变量需要和互斥量配合使用,属于另一种用于等待的同步机制,能阻塞一个或多个线程,直到收到另一个线程发出的通知或超时时,才能唤醒当前阻塞的线程。std::async是基于任务的,内部有调度器,比线程更高级别的抽象,可以看作是。原创 2023-06-30 16:37:20 · 234 阅读 · 0 评论 -
C++11新特性(4):emplace() 和 insert()
需要注意的是,新键值对添加到容器中的位置,并不是此迭代器说了算,最终仍取决于该键值对的键的值。失败时,说明容器中本就包含一个键相等的键值对,此时返回的迭代器指向的就是容器中键相同的这个键值对,bool 值为 False。由结果可以看出emplace()/emplace_back()只调用了一次构造函数,而insert()/push_back()多调用了一次移动构造函数(或拷贝构造函数)和析构函数。反之,如果添加失败,该迭代器指向的是容器中和要添加键值对键相同的那个键值对。原创 2023-04-06 11:51:00 · 3023 阅读 · 0 评论 -
C++11新特性(3):STL容器
unordered_map将key做了hash后,以无序的方式对数据进行存储,而之前的std::map是以红黑树的方式对key排序后进行存储的。a. std::list是双向链表,而forward_list是单向的,只提供向前迭代器,不支持反向迭代器,没有rbegin(),rend(),crbegin(),crend()等成员函数。forward_list是单向链表,只可以前进,在插入和删除频繁的场景下使用,相比于std::list节省了内存,提高了性能。不再以键值对的形式存储数据,而是直接存储数据的值。原创 2023-04-04 20:30:55 · 227 阅读 · 0 评论 -
C++11新特性(2):nullptr 和 NULL
1. nullptr是nullptr_t类型的右值常量,专门用于初始化空类型的指针。nullptr无法隐式转换为整型,而可以隐式匹配指针类型。VC中C++编译定义为: #define NULL 0。98用太久,学习下11,根据网上资料的知识总结。NULL隐式转换为整型。2. NULL是一个宏定义。原创 2023-03-30 15:12:09 · 176 阅读 · 0 评论 -
C++11新特性(1):auto 和 decltype
比如decltype()内层没有括号,那么得到的类型就是变量的类型;如果有多层括号decltype(())那么返回的就是引用。4. decltype的出现是为了弥补auto不支持对于表达式的类型推导的缺陷, 适用于后置返回类型的推导。1. 编译器推断出来的auto类型有可能和初始值类型不同。2. decltype的结果类型与表达式形式有密切关系。98用太久,学习下11,根据网上资料的知识总结。来推断类型的,而decltype是通过编译器。来得到它的类型,它不用将表达式的值计算出来。原创 2023-03-26 11:24:42 · 106 阅读 · 0 评论