您的位置:首页 > 编程语言 > C语言/C++

Thinking in C++第2版第一卷读书笔记

2009-04-16 18:36 337 查看
《Thinking in C++》PDF电子书
C++中先编译,后连接:
编译:将源码编译为代码;
连接:将库函数和各种自定义函数依次连接成为一个可执行文件。
C++中include不再使用.h后缀#include <stdio.h> 变在了#include <cstdio>。
#include<cstdlib>调用程序(控制台方式):system(“程序名”);。
#include <fstream>ifstream in(“文件名”);//打开文件以备读取ifstream out(“文件名”);//打开文件以备写入。
#include <vector>vector是一个类似List的容器,是范型的。
定义指针函数: void (*funcPtr)(),注意:void *funcPtr()是返回void*的函数。
right-left guideline:对指针采用先右结合,后左结合的解读方法。
可能释放资源要注意,可能有的指针会指向已经释放的地址。
数组c[]的长度sizeof c/sizeof *c:sizeof c是总长,sizeof *c是第一元素的长度。
匿名:可以匿名union、参数。
默认情况下const:在C中是外部链接级而C++中是文件内部链接级。所以要在定义const变量之外的文件中使用const,那么要在定义和引用时都声名extern,如:
extern int a = 1;//定义 extern int a;//声名。
在C中总是给const分配空间,而C++中只有无法编译时确定const值时才被迫为其分配空间。
const int* x; int const* x;//指向常量的指针,*先和右边结合。
int* const x;//常量指针
int const*const x; ó const int* const x;//指向常量的常量指针
字符数组指针(char* p = “abc”;)类型实际上是常量字符数组。如果想使数组不是常量,那么使用数组形式的定义char p[] = “abc”;
常量不能做左值。函数返回常量不能作为非常量的右值(int* ip = w();//不合法,w()返回const int*)。
类中声名成员函数为常函数,const关键字放在函数名()的后面。
不改变类成员的函数都应声名为常函数。
const类对象只能调用const成员函数,const成员函数只能修改mutable成员变量(如mutable int i;)。
int function(const T& a){}//强制不允许改变a的内容,如果函数内修改a,则进行拷贝构造。
volatile:编译时不优化。用法类似const。只有volatile成员函数可以访问volatile成员变量。
定义class时,在class定义内直接给出函数定义的函数自动成为inline函数,而无须使用关键字。如不想使用内联方式,则单独定义函数。
inline关键字不起作用的两种情况:1.函数体过于复杂;2.函数地址被明引或暗引。
using declares//指明名空间内具体的一个函数之类。
using directive//引用名空间。
static const数组的定义必须放在类定义外,static const类型中,只有int的定义可以放在类定义内,并且int数组也必须要类定义外定义,其余内置和自定义类型都不可在类定义内定义。
static initialization dependency:静态初始化依赖,当依赖者比被依赖者先初始化时会出错:
1. 别使用静态依赖
2. 将静态引用全部列入一个中间文件
3. 以上两种还无法解决此问题:
a) 使用静态初始化头文件初始化静态类型,在要使用的地方引用此.h文件。这时这个.h文件中的对象只在本文件中可用,再有其他文件引用此.h文件时,因为要引用的类型是static的,编译器会为其他文件分配单独的引用类型实例。
b) 将静态类型包装到函数当中,使用之前调用函数强制初始化(因为静态类型只初始化一次,注意:此时函数的实现不可在.h文件中采用内联方式,因为内联函数会为每一个调用它的对象复制一个函数实例,使得静态类型不止一次初始化)。(推荐)
C++中调用C写的函数应使用如下方式声名:
extern “C” {#include “Myheader.h”},或者extern “C” {各个函数声名},extern “C” 函数声名
引用必须定义时初始化。int x = 0; int& a = x;//此时表示a是x的一个别名,两者是等价的。
引用方式传递参数:实际上是传递的对象的一个引用,函数中可以改变原对象的值。而const类型无法以引用方式传递(因为它没有地址,所以无法引用),所以要将函数形式参数声名为const类型。
编译器在需要时会构造临时对象,这种对象的生命期短到不会引发对象间的冲突。
类内有类(组合Composite)的情况下,内部类必须有外部类调用的构造函数。换句话说,编译器不会为内部类生成默认构造函数。当组合进行Composite a; Composite b = a;时,Composite及其内部类的拷贝构造函数都会被调用(如果没有的话,编译器会生成位拷贝型的拷贝构造函数)。所以最好为每个类自定义拷贝构造函数(X (X&))以得到类的控制权。
将拷贝构造函数定义为private类型,可以避免系统自动生成拷贝构造函数。
对类内函数使用指针及引用类内函数,最好将其封装在类内。
子类中重写(重定义或修改签名)父类中有重载函数(包括静态)的众函数之一时,会导致这个函数的其它重载在继承类中隐藏。
子类使用父类中private类型的方法:在public模块中使用语句using 父类名::函数名(不带括号)。
面向对象程序设计语言的三大重要特性:1.data abstraction; 2. inheritance; 3. polymorphism.
对象切割(object slicing),在传递对象时我们通常采用传地址,当传值时就会发生这样的现象,较大的对象传给较小的类by value时,就会被截断。
纯虚析构函数(pure virtual destructor)必须提供定义,因为它比一般函数特殊。
在析构函数内部调用的函数,只调用本地版本,虚机制会被略过,以确保安全。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: