C++ Primer 3rd 读书笔记1/2(一)

2014-11-24 11:46:26 · 作者: · 浏览: 4

第一章 开始

1. C++中标准的头文件是不带.h后缀的。如下代码值得注意:

#include

void sayHello()

{

cout<<"Hello World!";

}

void main()

{

sayHello();

}

#include

using namespace std;

void sayHello()

{

cout<<"Hello World!";

}

void main()

{

sayHello();

}

#include

void sayHello()

{

std::cout<<"Hello World!";

}

void main()

{

sayHello();

}

引用带.h的头文件时,不需要使用namespace。引用标准的不带后缀名的头文件时,需要使用namespace。使用namespace有两种方式:1.通过using关键字调用。2.在具体的函数前通过::调用。例如std::cout。

2. #include称之为预处理器,有两种形式:<>表明文件时标准头文件,查找过程会检查预定义的目录,“”引用的表示该文件时用户提供的头文件,查找文件从当前目录开始,当前目录没有就查找预定义目录。通过如下代码防止重复处理:

#ifndef BOOKSTORE_H

#define BOOKSTORE_H

//content

#endif

使用如下代码判断预处理器常量是否已经被定义:

int main()

{

#indef DEBUG

cout<<”Beginning execution of main()”;

#endif

cout<<”Hello”;

}

如果定义了DEBUGE预编译器常量,那么会编译cout<<”Beginning execution of main()”;如果没有定义DEBUGE,不编译此句。

3. 基本的输入输出流有:cin、cout和cerr。换行输出为cout<

第二章 浏览

1. 在C++中,数组不能直接赋值。而在Java中,数组时可以直接赋值的。

2. 在C++中分为静态(在栈中)和动态(在堆中)分配内存。静态分配在编译时分配,效率高但缺乏灵活性;动态分配在执行时刻分配,效率低但灵活性高。静态对象是有名字的变量,我们直接对其进行操作;动态对象是没有名字的对象,我们通过指针对其进行操作。静态对象的分配和释放由编译器自动处理;动态对象的分配和释放由程序员显式管理,使用的是new和delete。

int *pia = new int(1024);//pia指向单一对象的地址

int *pint = new int[4];//pint指向拥有四个元素数组的第一个元素的地址

delete pia;//删除单一对象

delete []pint;//删除数组

3. 调用对象的方法时,点操作符用于类对象调用,->用于对象指针的调用。

4. 访问函数的开销比直接访问内存的开销大。通过对象的方法访问对象的变量时(访问对象的方法是访问函数,访问对象的变量直接访问内存),C++通过inline机制,将调用函数在调用点展开,节省了开销。

5. 引用是没有指针语法的指针。

6. 类的构造函数用来初始化对象的数据成员,析构函数负责释放对象生命周期内申请到的所有资源。

7. 在继承操作中,基类中需要在子类实现的函数应使用virtual修饰。C++支持多继承。继承关系反映的是is-a的关系。组合关系反映的是hava-a的关系。

第三章 C++数据类型

1. 基本数据类型:

char(1bit)、short(2bit)、int(4bit)、long(4bit)、float(4bit)、double(8bit)

其中char、short、int和long为整型,分为有符号和无符号,默认为有符号。文字常量,例如数字1,其值不能改变,并且不可寻址。相比于文字常量,变量是可以寻址的,每个变量有两个值与其对应,分别是数据值和地址值。

2. Class A;是声明,声明不是定义,不引起内存分配。

A a(100);静态分配

A *a = new A(100);动态分配

3. C++中的关键字:

关键字explicit可以禁止“单参数构造函数”被用于自动类型转换

class Stack

{

explicit Stack(int size);

};

没有explicit的话Stack s = 40;能编译通过

而有explicit则不能,必需Stack s(40);

关键字mutable意为:可变的。用于在const的函数里面修改一些跟类状态无关的数据成员

关键字volatile被设计用来修饰被不同线程访问和修改的变量。volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.

4. 基本数据类型变量的初始化:如果该基本类型的变量是在全局域定义的,系统初始化其值为0,如果是局部域或者通过new定义的,系统不对其初始化

5. 对象的初始化支持两种方式。1.int a=100;2.inta(100);

6. 空指针(void*)可以接受任何指针类型的地址值赋值,它表明该值是个地址值,但是该地址值的对象类型不知道,不能知道该指针覆盖的内存区域。

7. C++提供两种风格的字符串类型,一种是老式的C风格字符串,另一种是标准的C++引入的字符串string。使用老式的C风格字符串需要#include ,常使用一个char *类型的指针指向。例如char *s=”Hello”;当char *s=0;或者char *s=””;时,其长度为0。老式的字符串使用 strlen测定器长度,不包括\0。使用标准C++的字符串string,需要包含头文件#include ,使用size()方法获取其长度。通过size()= =0或者empty()方法判断字符串是否为空。string提供对老式C语言中字符串的支持,可以与其运算,可以将老式C语言风格的字符串转换为string类型,反之则不行,需要通过constchar *s = s1.c_str()转换。

8. 对于字符串的赋值。s2=s3;过程如下:首先将s2关联的字符存储区释放掉,然后分配足够存储与s3相关联的字符的存储区,最后将与s3相关联的字符拷贝到该存储区中。注意这里与Java的区别。

9. const定义变量为常量,使得变量的值不能被修改常量必须初始化非const对象的指针不能指向const对象。const指针可以指向非const变量,此时也不能通过指针修改其值。

A.const int*p=0;//(自右向左)p是一个指向int类型的,被定义为const对象的指针。称之为:指向const的指针指向const的指针可以指向其他,但是不能改变指向的值。const int *p 等价于 int const *p。(const关键字位于第一、第二位置都是指向const的指针)

const double minWage = 0;

p=&minWage;

*p=100;//×指向const的指针可以指向其他,但是不能改变指向的值

double dval=3.14;

p=&dval;

*p=100;//×指向const指针可以指向其他,但是不能改变指向的值

指向const的指针常用在函数的参数中,例如int strcmp(const char *str)用于保证被传递到函数中的实际对象在函数中不被修改。

B.interr=0;int *const cur=&err;//cur是指向int类型的const指针。称之为:const指针const指针不能指向其他的地址值,但是可以修改其值。

C.const double pi=3.14;const double *constpi