C++Primer5笔记

Part1

第一章

1.2

命名空间:用于解决不同库,类和变量同名的问题,表明该对象出自何处。本质上是定义了对象的范围,例如:不同文件夹代可以有同名的文件,文件夹作为命名空间将它们区分。
如:std::cin的意思为:从左侧std的命名空间找到右侧的名字。

using声明:如,using std::cin声明后,后面代码中的cin便不用std::了。注意:using声明一般不放在头文件中,否则容易产生冲突。

1.5

类的创建初衷:使程序员能够定义和使用像内置类型一样自然的类类型(class type)。

第二章:

2.1

对象的含义(不是oop的“对象”):被存储的每一个值都占用了一块内存,而这块内存被称为存储值表示的的对象。

二进制单位:bit(0和1)
可寻址的最小内存块:byte(8bit)
计算机存储基本单元:word(4/8 byte; 32位 64位)

字面值常量(自己的理解):一种从字面形式就知道(数据类型)的可以用来初始化特定变量的值。

2.3

引用:一般指左值引用,因为放到右边意思变成了取地址符。

2.4

顶层const:表示指针本身是常量,如int *const p = i;定义了一个常量指针,指针本身不能改变,不能指向其他对象,指针指向的对象可以变。
底层const:表示指向的对象是一个常量,如const int * p = i;定义了一个指向常量的指针,指针指向的对象不能被改变,指针本身可以改变以指向其他的对象。

常量表达式:编译过程就能知道结果且在程序中不会被改变的表达式。

2.6

数据结构:把一组相关的数据组织起来然后操作和使用他们的策略和方法。

预处理器防止重复包含:

 #ifndef SALES_DATA_H   //  头文件保护符。当sales_data.h未被包含时,为真,第二次包含时为假,自动跳过ifndef到endif中的内容
 #define SALES_DATA_H   //  用define指定预处理变量
 struct Sales_data.h{
   xxx
   xxx
 };
 #endif 

第三章

3.2

cin读取string对象时,从第一个非空字符读起,直至一个空字符(开)。
如果想读取空字符则使用getline(cin, s);该函数读取单位为一行(遇到n结束,且'n'在读取完毕后被从缓冲区清除)。

string.size()返回string对象的长度,注意,其返回的是size_type类型的值,一般为无符号整型。可以用:auto len = line.size();来判断返回值的类型。

string在做+运算时,应该保证+运算的两侧,至少有一个是string类型的对象,即不能把字面值直接相加!

使用循环操作string对象中的字符:

string s("hello");
for(auto c : s) //类似迭代器的东西
    cout << c << endl;

如果想要改变对象中的值,则需使用引用的方式迭代:

string s("hello");
for(auto &c : s) //类似迭代器的东西
    c = toupper(c);

3.4

迭代器用法:

auto b = v.begin(), e = v.end();   
//begin返回的第一个元素的迭代器
//end返回尾元素的下一位置,end返回的迭代器称为尾后迭代器
//如果容器为空,begin和end同时返回尾后迭代器

箭头运算符:
例如it->m 等价于(*it).m

!改变迭代器所属容器的元素数量将导致迭代器失效
!迭代器支持-运算,不支持+运算~~~~

第四章

4.11

显式类型转换:
static_cast:除底层const对象都可以使用,例如

void *P = &d;
double * dp = static_cast<double*>(p);

const_cast:用于去除对象const性质,只用于改变对象的底层const,例如

const char *p;
char *cp = const_cast<char*>(cp);

第五章

5.6 try语句块和异常处理

三种异常处理:
1.throw + 表达式
如:
if(..) throw runtime_error("xxx"); //抛出异常终止当前函数,控制权交给异常处理代码
2.try + catch

try{
    //可能出现异常的代码块
    //用throw抛出异常
}catch{
    //异常处理代码
}

3.标准异常
头文件<stdexcept>

第六章-函数

6.2函数参数传递

引用形参是c++区别于c的特性,c没有引用传递。
引用传值意义:
1.避免数组,字符串等的大量拷贝
2.隐式的返回除返回值外的其他值(改变调用该函数的函数的参数)

const形参:因为实参初始化形参时,会自动忽略顶层const,所以传入顶层const参数时,形参也应该带const。

为什么普通引用不能绑定const对象或者字面值:
因为如果引用和实际对象的类型不同,编译器会先生成一个与引用类型相同的对象temp并用实际对象将其初始化,再将引用指向该temp对象,所以引用没有指向实际对象,引用也就失去了意义。

数组形参管理的三种方式:
1.使用标记,例如c风格的字符串末尾有'0',可用于判断数组结束。
2.传递数组首位指针,使用标准库<iterator>中的begin和end。
3.直接传递数组大小。

6.3

decltype(object):返回object的类型。
6.3.3没看明白

6.5特殊函数用途

内联函数:直接将函数调用在编译时转为代码块,解约多次调用函数的开销。

6.5.3-6.7暂时跳过

第七章-类

7.2定义ADT

如何将this声明为常量指针:将const置于函数的形参列表之后,块之前。这样的成员函数称之为:常量成员函数。且常量对象只能调用常量成员函数

编译器对于类的处理步骤:
1.首先编译类成员的声明————所以声明可以不用在乎顺序
2.编译成员函数体

阅读 135

推荐阅读