博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++ 之 0 导读(Introduction)
阅读量:6875 次
发布时间:2019-06-26

本文共 2790 字,大约阅读时间需要 9 分钟。

Effective C++

导读 (Introduction)

 

术语(terminology)

声明式 (declaration) 是告诉编译器某个东西的名称和类型(type),但略去细节。以下都是声明式:

extern int x;                             //对象(object)声明式std::size_t numDigits(int number);        //函数(function)声明式class Weight;                             //类(class)声明式template
//模板(template)声明式

每个函数的声明式揭示其签名式(signature),也就是参数和返回类型.一个函数的签名等同于该函数的类型.

定义式 (definition) 的任务是提供编译器一些声明式所遗漏的细节。对对象而言,定义式是编译器为此对象拨发内存的地点。对 function 或 function template 而言,定义式提供了代码本体。对 class 或 class template 而言,定义式列出它们的成员:

int x;                                        //对象的定义式std::size_t numDigits(int number)             //函数的定义式{                                             //此函数返回其参数的数字个数    std::size_t digitsSoFar = 1;    while ((number /= 10) != 0) ++digitsSoFar;    return digitsSoFar;}calss Widget {                                //class的定义式public:    Widget();    ~Widget();    ...};template
//template的定义式

初始化(Initialization)是“给予对象初值”的过程。对用户自定义类型的对象而言,初始化由构造函数执行。

 

default 构造函数是一个可被调用而不带任何实参者。这样的构造函数要不没有参数,要不就是每个参数都有缺省值:

class A {public:    A();                                      //default构造函数};class B {public:    explicit B(int x = 0, bool b = true);    //default构造函数};class C {public:    explicit C(int x);                       //不是default构造函数};

上述的 class B 和 C 的构造函数都被声明为 explicit,这可阻止它们被用来执行隐式类型转换(implicit type conversions), 但它们仍可被用来进行显示类型转换(explicit type conversions):

void doSomething(B bObject);         //函数,接受一个类型为B的对象B bObj1;                             //一个类型为B的对象doSomething(oObj1);                  //传递一个B给doSomething函数B bObj2(28);                         //根据 int 28 建立一个B,函数的 bool 参数缺省为 true doSomething(28);                     //错误!doSomething应该接受一个B而非一个int,而int至B之间并没有隐式转换doSomething(B(28));                  //使用B构造函数将int显示转换(也就是转型,cast)为一个B以促成此一调用

被声明为 explicit 的构造函数通常比其 non-explicit 兄弟更受欢迎,因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。

copy 构造函数被用来“以同型对象初始化自我对象”,copy assignment 操作符被用来“从另一个同型对象中拷贝其值到自我对象”:

calss Widget {public:    Widget();                                //default 构造函数    Widget(const Widget& rhs);               //copy 构造函数    Widget& operator=(const Widget& rhs);    //copy assignment 操作符    ...};Widget w1;         //调用 default 构造函数Widget w2(w1);     //调用 copy 构造函数Widget w3 = w2;    //调用 copy 构造函数 !
w1 = w2;           //调用 copy assignment 操作符

区分“copy构造”和“copy赋值”:

如果一个新对象被定义,一定会有个构造函数被调用,不可能调用赋值操作。如果没有新对象被定义,就不会有构造函数被调用,那便是赋值操作被调用。

 

命名习惯(Naming Conventions)

参数名 lhs (left-hand side) 和 rhs (right-hand side)用于二元操作符函数如 operator== 和 operator* 的参数名称.对于成员函数,左侧实参由 this 指针表现出来, 所以单独使用参数名称 rhs.

将”指向一个 T 型对象”的指针命名为pt, 意思是”pointer to T”. 如 pw = “ptr to Widget”. 而 rw 可以表示 reference to Widget.

 

关于线程(Threading Consideration)

 

TR1 和 Boost

转载于:https://www.cnblogs.com/VVingerfly/p/4441184.html

你可能感兴趣的文章
Android面试题
查看>>
【转】Sublime Text 2 - 简单介绍
查看>>
mongoose 小问题
查看>>
福大软工 · 第十一次作业 - Alpha 事后诸葛亮(团队)
查看>>
python爬虫笔记3
查看>>
Linux环境测试机器端口连通性
查看>>
关于Linux连接工具mobaxterm显示中文乱码问题
查看>>
iphone-common-codes-ccteam源代码 CCUILabel.h
查看>>
码农们:你属于哪一种极品程序员?
查看>>
【Daily】Javascript事件对象
查看>>
时间记录日志
查看>>
菜谱查询接口文档
查看>>
Mybatis——SQL语句构建器类
查看>>
LeetCode——Search a 2D Matrix II
查看>>
链表中环的入口结点
查看>>
什么是区块链?
查看>>
了解MIP(Mobile Instant Pages)
查看>>
SVN版本冲突解决详解 - snwrking的专栏 - 博客频道 - CSDN.NET
查看>>
Oralce安装、使用过程中出现的问题
查看>>
ny14 会场安排问题
查看>>