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

本文详细介绍了C++编程的基础知识,包括编译与连接过程、预处理指令的使用、指针与引用的定义与操作、const与volatile关键字的作用、类与对象的概念以及面向对象的三大特性等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《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 *csizeof 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;//此时表示ax的一个别名,两者是等价的。

引用方式传递参数:实际上是传递的对象的一个引用,函数中可以改变原对象的值。而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)必须提供定义,因为它比一般函数特殊。

在析构函数内部调用的函数,只调用本地版本,虚机制会被略过,以确保安全。

Bruce Eckel 《Thinking in Java》(Java编程思想)作者。Eckel有20年专业编程经验,并自1986年起教育人们如何撰写面向对象程序,足迹遍及全球,成为一位知名的 C++教师和顾问,如今兼涉Java。他是C++标准委员会拥有表决权的成员之一,曾经写过另五本面向对象编程书籍,发表过150篇以上的文章,是多本计算机杂志的专栏作家。Eckel开创Software Development Conference的C++、Java、Python等多项研讨活动。拥有应用物理学学士和计算机工程学硕士学位。 目录 译者序 前言 第1章 对象导言 第2章 对象的创建与使用 第3章 C++中的C 第4章 数据抽象 第5章 隐藏实现 第6章 初始化与清除 第7章 函数重载与默认参数 第8章 常量 第9章 内联函数 第10章 名字控制 第11章 引用和拷贝构造函数 第12章 运算符重载 第13章 动态对象创建 第14章 继承和组合 第15章 多态性和虚函数 第16章 模板介绍 附录A 编码风格 附录B 编程准则 附录C 推荐读物 索引 第2卷:实用编程技术 出者的话 专家指导委员会 译者序 前言 第一部分 建立稳定的系统 第1章 异常处理 第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发 附录 附录A 推荐读物 附录B 其他 索引 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值