编程语言
首页 > 编程语言> > 《Effective Modern C++》学习总结(条款11- 15)

《Effective Modern C++》学习总结(条款11- 15)

作者:互联网

条款11:优先使用delete关键字删除函数而不是private却又不实现的函数

1.=delete 是C++ 11新特性——见侯捷C++ 九中的描述

2.小技巧1:使用delete能够防止隐式转换(见第一部分侯捷C++ 九)——通过把隐式转换的重载函数都delete,避免隐式转换,充分利用了delete和重载函数决议的规则

3.小技巧2:使用delete可以避免不必要的模板具现化

template<typename T>
void processPointer(T* ptr)
template<>
void processPointer<void>(void*) = delete;

template<>
void processPointer<char>(char*) = delete;

4.请记住:

 

条款12:使用override关键字声明覆盖的函数

1.override使用的目的:防止虚函数在使用的时候因为各种原因无法正常完成覆写

2.如果要使用覆盖的函数,几个条件必须满足:

class	Widget{ 
public:
	...
	void doWork() &;								//只有当*this为左值时 
													//这个版本的doWorkd()函数被调用
	void doWork() &&;								//只有当*this为右值 
													//这个版本的doWork()函数被调用 
};
Widget makeWidget();								//工厂函数,返回右值 
Widget w;											//正常的对象(左值)
...
w.doWork();											//为左值调用Widget::doWork()	即Widget::doWork	&
makeWidget().doWork();								//为右值调用Widget::doWork()	即Widget::doWork	&&

3.一些正确的示范——virtual函数的覆写

class Base { 
public:
	virtual void mf1() const;
	virtual	void mf2(int x);
	virtual	void mf3() &;
	virtual	void mf4() const; 
};
class Derived: public Base { 
public:
	virtual	void mf1() const override;
	virtual	void mf2(int x)	override;
	virtual	void mf3() & override;
	void mf4() const override;						//	加上"virtual"也可以,但是不是必须的
};

4.请记住:

 

条款13:优先使用const_iterator而不是iterator

1.标准实践中,当你需要迭代器并且不需要更改迭代器指向的值的时候,你应该使用const_iterator

2.C++ 11 中的const_iterator既容易获得也容易使用

3.一个通用模板代码:

template <typename C, typename V>
void findAndInsert(C& container, const V& targetVal, const V& insertVal) {
	using std::cbegin;
    using std::end;

    auto it = std::find(cbegin(container), cend(container), targetVal);
    container.insert(it, insertVal);
}

4.请记住:

 

第四章:智能指针

 

条款14:将不会抛出异常的函数声明为 noexcept

在任何时候,只要知道函数不会产生异常,就声明为noexcept

1.在 C++ 11 中,绝对的 noexcept 用于修饰保证不会发出异常的函数

int f(int x) throw()    // C++98 style —— less optimizable
int f(int x) noexcept   // C++ 11 style —— most optimizable

2.举例:用move代替拷贝std::vector元素

3.请记住:

 

条款15:尽可能地使用constexpr

1.当constexpr用于对象时,它本质上是const的一种增强形式

2.当constexpr用于函数时:

class Point {
public:
    constexpr Point(double xVal = 0, double yVal = 0) noexcept
    : x(xVal),y(yval) {}

    constexpr double xValue() const noexcept { return x; }
    constexpr double yValue() const noexcept { return y; }

    void setX(double newX) noexcept { x = newX; }
    void setY(double newY) noexcept { y = newY; }
private:
    double x,y;
};

3.从概念上讲,constexpr修饰的值不仅仅是一个常量值,而且还是一个编译期就知道的值

4.与const的区别

int sz;
constexpr auto arraySize1 = sz;     // error sz's value not known at compilation
std::array<int, sz> data1           // error array size need compilation value
constexpr auto arraySize2 = 10;     // fine
std::array<int, arraySize2> data2;  // fine

5.请记住:

标签:11,const,函数,Effective,void,C++,constexpr,15,noexcept
来源: https://blog.csdn.net/maoyuxuan159/article/details/122121371