Professional C++阅读笔记 chapter 29 Writing Efficient C++
Posted gjw-jackson
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Professional C++阅读笔记 chapter 29 Writing Efficient C++相关的知识,希望对你有一定的参考价值。
chapter 29 Writing Efficient C++
- 作者建议将所有class function包括析构函数 但是除了构造函数,都设为virtual的,因为virtual function的开销非常小
- design 和 algrithm 比语言层面的优化重要太多
- 在选择是通过值传递还是引用传递参数时,只有当需要复制该参数且该参数支持move语义时,才使用值传递
- 当参数是父类,传递的是子类时,不能用值传递,否则会造成类切割
- 只有当传递nullptr是需要的时候,才选择指针传参,否则都选择引用传参
- 尽量使用编译器提供的NRVO和RVO,即直接返回局部变量
Person createPerson()
person p1;
person p2;
return isGood() ? p1 : p2;
上述情况不会引起NRVO
Person createPerson()
person p1;
person p2;
if (isGood())
return p1;
else
return p2;
这种情况可以引起NRVO
C++ Primer 5th笔记(chap 19 特殊工具与技术)嵌套类
1. 嵌套类( nested class)或嵌套类型( nested type )
一个类可以定义在另一个类的内部,这个类常用于定义作为实现部分的类。
class TextQuery {
public:
class QueryResult; // 嵌套类稍后定义
}
// QueryResult是TextQuery的成员
class TextQuery::QueryResult {
// 位于类的作用域内, 因此我们不必对QueryResult形参进行限定
friend std::ostream& print(std::ostream&, const QueryResult&);
public:
// 嵌套类可以直接使用外层类的成员, 无须对该名字进行限定
QueryResult(std::string, std::shared_ptr<std::set<line_no>>,
std::shared_ptr<std::vector<std::string>>);
};
1.1 相互独立
嵌套类是一个独立的类, 与外层类基本没什么关系。嵌套类也使用访问限定符来控制外界对其成员的访问权限。
- 外层类对嵌套类的成员没有特殊的访问权限, 同样, 嵌套类对外层类的成员也没有特殊的访问权限。
- 嵌套类的对象只包含嵌套类定义的成员; 同样, 外层类的对象只包含外层类定义的成员, 在外层类对象中不会有任何嵌套类的成员
1.2 作用域
嵌套类的名字在外层类作用域中是可见的, 在外层类作用域之外不可见。
- 嵌套类的名字不会和别的作用域中的同一个名字冲突。
- 嵌套类中成员的种类与非嵌套类是一样的。
位于外层类 protected 部分的嵌套类定义的类型只能被外层类及其友元和派生类访问
位于外层类private 部分的嵌套类定义的类型只能被外层类的成员和友元访问
1.3 定义嵌套类的成员
TextQuery::QueryResult::QueryResult(string s, shared_ptr<set<line_no>> p,
std::shared_ptr<std::vector<std::string>> f) :
sought(s), lines(p), file(f) { }
1.4 嵌套类的静态成员定义
如果 QueryResult 声明了一个静态成员, 则该成员的定义将位于 TextQuery 的作用域之外。 例如, 假设 QueryResult 有一个静态成员, 则该成员的定义将形如:
// QueryResult 类嵌套在 TextQuery 类中,
// 下面的代码为 QueryResult 定义一个静态成员
int TextQuery::QueryResult::static mem = 1 0 2 4;
1.5 嵌套类作用域中的名字查找
嵌套类是其外层类的一个类型成员, 因此外层类的成员可以像使用任何其他类型成员一样使用嵌套类的名字。
//返回类型必须指明 QueryResult 是一个嵌套类
TextQuery::QueryResult TextQuery::query (const string Ssought ) const
{
//如果我们没有找到sought, 则返回set的指针
static shared _ptr<set<line_no» nodata (new set<line_no>) ;
//使用find而非下标以避免向 wm 中添加单词
auto loc = wm.find(sought) ;
if (loc wm.end())
return QueryResult(sought, nodata, file) ;//没有找到
else
return QueryResult(sought, loc->second, file);
}
以上是关于Professional C++阅读笔记 chapter 29 Writing Efficient C++的主要内容,如果未能解决你的问题,请参考以下文章
C++ Primer 5th笔记(chap 18 大型程序工具)使用命名空间成员
C++ Primer 5th笔记(chap 19 特殊工具与技术)枚举类型
C++ Primer 5th笔记(chap 18 大型程序工具)noexcept
C++ Primer 5th笔记(chap 18 大型程序工具)命名空间