时间:2016年7月30日 天气:晴:sunny:
Author:冬之晓:disappointed:
Email: 347916416@qq.com
MyAppearance:
今天是周六,同宿舍的一位舍友要走了,我就决定搬到宿舍里屋。这位舍友叫杨志成 ,他是另一家公司的职员,他来我现在的单位上班只是出差,因为这边的单位是新成 立的,因此就过来出差了一年。早晨他走的时候把能留下的东西都给我了,比如说衣架、 洗衣粉、电脑桌、镜子之类的生活用品。我非常感动,这个世界上还是好人比较多。 在宿舍这边由于距离吃饭的地方比较远,而且天气非常热,因此到吃饭的时 间都不想出门。可是到了下午自己快饿死了,就决定和江威一起去超市转转。 去完超市后,我全身都汗湿透了。非常难受,不过在超市里面发现了好多甜点,非常 棒!下午,我到相邻宿舍里坐了一下,给他们带点吃的东西,因为刚来公司我的手机就丢 啦,当时多亏这个同事给我画了一张从公司到宿舍的地图。顺便问问公司的情况,最后得 到的结论是公司比较小……
今天是周六,我决定放松一下心情,复习一下C++的基础内容。虽说是基础,但是我感觉还是比较重要的,这些内容来自于《Effect C++》,我把一些重要的知识点摘抄下来,以便以后能够随时复习!
术语
我觉得C++里面比较重要的基础就是一些术语。
- 首先较为重要的术语就是声明式,它是用来告诉编译器某个东西的名称和类型,但略去细节。
如下面几个例子:
extern int x; //对象声明式
std::size_t numDigits(int number); //函数声明式
class Widget; //类声明式
//下面的一个声明式我也不熟,从没用过!
template<typename T> //模板声明式
class GraphNode;
注意:每个函数的声明揭示了其签名式,也就是参数和返回类型。例如上述代码中的numDigits
的签名就是std::size_t (int)
。
- 定义式的任务是提供编译器一些声明式所遗漏的细节。对对象而言,定义式是编译器为此对象拨发内存的地点。对函数和函数模板而言,定义式提供了代码的本体。对类和类模板而言,定义式列出他们的成员。
比如下面的例子:
int x; //对象的定义式
std::size_t numDigits(int number) //函数的定义式
{
std::size_t digitsSoFar = 1;
while((number /= 10) != 0) ++digitsSoFar;
return digitsSoFar;
}
class Widget //类的定义式
{
public:
Widget();
~Widget();
...
};
//下面的一个定义式我也不熟,从没用过!
template<typename T> //模板定义式
class GraphNode
{
public:
GraphNode();
~GraphNode();
};
- 初始化是给予对象初值的过程。对用户自定义类型的对象而言,初始化由构造函数执行。
- 默认构造函数是一个可被调用而不带任何实参者。这样的构造函数要不就没有参数,要不就每个参数都有缺省值
- explicit声明可以被用来阻止隐式类型转换。它能够禁止编译器执行非预期的类型转换。除非有一个好理由允许构造函数被用于隐式类型转换,否则最好都要声明为
explicit
。 - 出现
=
的地方要特别小心,即可能用来调用拷贝构造函数,也可能调用拷贝赋值操作符。区别是如果有新对象被定义,肯定调用的是构造函数!! - 不明确行为指某些C++构件的行为没有定义,如:
int *p = 0; //p是个null指针
std::cout << *p; //对一个null指针取值会导致不明确行为
char name[] = "Darla"; //name是个数组,大小为6(尾端有null)
char c = name[10]; //值到一个无效数组的索引也是不明确行为
不明确行为的结果是不卡预期的,一定要想办法避免!!