「C++ 类和对象篇 2」对象及其成员在内存中的存储

目录

一、类在内存中的存储位置

二、对象在内存中的存储位置

1. 全局对象

2. 非静态局部对象

3. 静态局部对象

4. 动态对象

【代码演示】 

【内存布局】

三、成员函数存储方法

四、成员变量在内存中的存储

【成员变量的内存布局探索】 

【总结】 

【代码演示】 

【静态成员变量的存储位置】 


一、类在内存中的存储位置

  • 类不会储存在内存中,类只是一个模板告诉程序,如何创建一个对象、需要多少个字节、以及如何销毁等等。
  • 类实例化出的对象才会保存中内存中。

二、对象在内存中的存储位置

1. 全局对象

        全局对象存放在全局(静态)存储区,程序结束后由系统调用析构函数释放。


2. 非静态局部对象

        局部对象存放在中。其生命在作用域结束时结束,它的析构函数会自动被调用,即对象自动被清理。

        const修饰的对象仅表示该对象的值是只读的,而不是对象本身存储的位置发生了变化。


3. 静态局部对象

        静态局部对象存放在全局(静态)存储区,其生命在作用域结束之后仍然存在,即此时对象的析构函数并不会被调用,直到整个程序结束。


4. 动态对象

        动态对象(即new出来的对象)存放在中,其生命在它被 delete 之际结束。用于创建动态对象的指针存放在栈中。
        注:new 的对象,必须使用 delete 去显式的调用析构函数,否则程序不会去调用其析构函数,从而造成内存泄露。


【代码演示】 

class A{
};
class B{
};
class C{
};
class D{
};

A a;  //全局对象
int main(){
	B b;  //局部对象
	static C c;  //静态局部对象
	D *d = new D;  //动态对象
	delete d;
	return 0;
}

【内存布局】

三、成员函数的存储方法

成员函数存储方法猜想一:将成员函数的地址和成员变量都存在对象中

        存在问题:调的成员函数都是一样的,所以没必要都每个对象都存一个成员函数的地址。


成员函数存储方法猜想二:将成员函数的地址单独存放进一张表中,然后存储时多存一个表的地址

        这种方法没有什么问题,但没有被采用。


成员函数存储方法猜想三:对象中只存成员变量,将成员函数统一存放在公共代码区。

        这个方案就是成员函数的存储方案,运行时不会在对象中找函数的地址,编译链接时才会根据函数名去公共代码区找到函数的地址。


总结:对象中只存成员变量,成员函数将统一存放在公共代码区。

        所以类在遇到如下情况,程序不会崩溃。(因为找成员函数的地址不是在类中找,是去公共代码区找,所以类被实例化为nullptr我们依然能够调用成员函数)

四、成员变量在内存中的存储

【成员变量的内存布局探索】 

在C++的对象的成员变量可分为两种:静态成员变量的和非静态成员变量,它们在C++的内存中是如何分布的呢?博主通过下面的代码进行了粗略的探索:

class Student
{
public:
	int name;
	int age;
	static int gender;
};

// 在类外定义静态成员变量,并初始化为10。
int Student::gender = 10;

int main()
{
	Student a = Student(); 
	cout << "对象的地址:" << &a << endl;
	cout << "非静态成员变量的地址:" << &(a.name) << "," << &(a.age) << endl;
	cout << "静态成员变量的地址: " << &(a.gender) << endl;
	return 0;
}


通过代码的运行结果可看出:

        非静态成员变量放在类的对象之中,且非静态成员变量在内存中的存放顺序与其在类内的声明顺序一致。静态成员变量存放在类的对象之外。即Student对象的内存分布如下图所示:

【总结】 

1)类内的静态成员变量  ------------   静态区

2)类内的非静态成员变量  ------------   和对象的存储位置有关,类的非静态成员变量并不能决定自身的存储空间位置。决定存储位置的是对象的创建方式,即:

        a)如果是全局对象,则对象,对象的成员变量保存在静态区。

        b)如果是非静态局部对象,则对象,对象的成员变量保存在栈区。

        c)如果是静态局部对象,则对象,对象的成员变量保存在静态区。

        d)如果是动态对象,则对象,对象的成员变量保存在堆区。

(const修饰只是将变量限定为只读的,本质还是变量,存储位置看变量本身,所以const修饰的成员变量的存储位置仍要看对象的存储位置。)

无论是哪种方式创建对象,类的成员变量的存储位置都是相对于对象的起始位置来确定的。不同的成员变量可能会有不同的偏移量,这取决于编译器对类的内存布局的处理方式。


【代码演示】 

// 以下代码用于演示类内的非静态成员变量的存储位置和对象的存储位置有关
class Student
{
public:
	int name;
	int age;
};

Student a = Student(); //全局对象
int main()
{
	Student b = Student(); //局部对象
	static Student c = Student(); //静态对象
	Student* d = new Student; //动态对象
	cout << "全局对象的地址:" << &a << ",全局对象的成员变量的地址:" << &(a.name) << " " << &(a.age) << endl;
	cout << "局部对象的地址:" << &b << ",局部对象的成员变量的地址:" << &(b.name) << " " << &(b.age) << endl;
	cout << "静态对象的地址:" << &c << ",静态对象的成员变量的地址:" << &(c.name) << " " << &(c.age) << endl;
	cout << "动态对象的地址:" << d << ",静态对象的成员变量的地址:" << &(d->name) << " " << &(d->age) << endl;
	return 0;
}

【静态成员变量的存储位置】 

        在C++中,类的静态成员变量被存储在全局/静态存储区。这些成员变量在类对象被创建之前就已经存在,并且在程序执行期间一直存在。

        需要注意的是,静态成员变量只能被初始化一次,通常在类定义时完成。如果静态成员变量没有显式初始化,则会被默认初始化。对于数值类型的静态成员变量,默认初始化为0;对于引用类型的静态成员变量,默认初始化为空引用。但是需要注意的是const修饰和数组类型的静态成员变量的特殊情况,它们必须在类定义中进行显式初始化。

        C++中的静态成员变量存储在类的全局数据区。静态成员变量在程序运行时只有一个实例,无论有多少个类的对象被创建,它们都共享同一个静态成员变量。因此,静态成员变量的存储空间位置是在类的数据段。


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
作者:张耀仁(是code不是书) 出版社:国铁道出版社 出版日期:2006-07 内容简介 本书包含所有重要的有关C++程序设计的知识,除了入门的基础知识之外,对较深入的内容也作了讲解,例如对VPTR和VTABLE都有精彩的说明。本书提供了极佳的学习步调和连贯的先后次序,叙述方式主线明显,使读者不会为枝节所扰而混淆了学习主线,以达到良好的学习效果。. 本书内容不仅涵盖了最基本的语法,也深入探讨了面向对象的主要思想,可为C++程序设计语言的学习打下坚实基础,不仅适合程序设计语言的初学者,也适合使用C++程序设计语言开发应用软件的工程师。... 编辑推荐 为了符合读者的需要,本书采取简明易懂的叙述方式,并通过精心安排的大量例题,使每学完一章都可以编写出相应的程序。例如,如何避免语法和语义的错误,如何使用预处理指令,如何产生随机数,如何估计程序运算所花费的时间,如何从现有文件读取数据,如何将执行结果存盘,如何使用对象来仿真实际的互动关系等常遇到的编程问题,都可在本书内找到答案。本书配盘内附超过180个完整的范例程序,全部经过符合最新ANSI/ISO标准的C++编译器测试,并能正确执行。 目录 PART I C++程序语言基础 第1章 基本概述 1.1 计算机的发明与演进 1.2 计算机的基本结构 1.3 冯·诺依曼结构 1.4 计算机内部的数据表达方式 1.5 软件 1.6 程序语言(Programming Ianguages 1) 1.7 c++程序语言 1.8 程序语言的演变 1.9 本章重点 1.10 本章练习 第2章 C++的基本语法和使用环境 2.1 基本程序开发步骤 2.2 第一个完整的C++程序 2.3 延迟DOS窗口界面自动关闭的方法 2.4 Borland C++编译器的取得和安装使用 2.5 Visual c++.NET程序开发步骤 2.6 第二个C++程序 2.7 C++标识符的命名规则 2.8 本章重点 2.9 本章练习 第3章 基本数据型 3.1 整数和浮点数 3.2 变量和常量 3.3 算术运算 3.4 标准数学函数的运算 3.5 逻辑值及其运算 3.6 字符与字符串 3.7 位处理运算 3.8 常犯的错误 3.9 本章练习 第4章 分支 4.1 算法的描述方式 4.2 变量的适用范围 4.3 if.else语句 4.4 嵌套if.else语句 4.5 switch语句 4.6 条件运算符 4.7 goto无条件跳转语句 4.8 常犯的错误 4.9 本章重点 4.1 0本章练习 第5章 循环 5.1 循环指令的种 5.2 while循环 5.3 continue和break 5.4 do.while循环 5.5 for循环 5.6 嵌套循环 5.7 常犯的错误 5.8 本章重点 5.9 本章练习 第6章 函数 6.1 函数的基本概念 6.2 以引用的方式调用 6.3 inline函数 6.4 变量的适用范围和生存期间 6.5 常犯的错误 6.6 本章重点 6.7 本章练习 第7章 数组 7.1 一维数组 7.2 将数组当成函数的参数 7.3 二维数组 7.4 将二维数组当成函数的参数 7.5 常犯的错误 7.6 本章重点 7.7 本章练习 PART II 高级C++程序设计语言 第8章指针 8.1 内存地址与指针 8.2 指针与引用 8.3 数组与指针的代数计算 8.4 指针参数 8.5 函数指针 8.6 动态内存分配 8.7 常犯的错误 8.8 本章重点 8.9 本章练习 第9章 字符串 9.1 字符串的基本概念 9.2 字符串的输入与输出 9.3 字符串的处理 9.4 字符串的指针数组 9.5 字符串处理在编码上的应用 9.6 常犯的错误 9.7 本章重点 9.8 本章练习 第10章 函数的高级应用 10.1 函数的重载 10.2 参数的默认值 10.3 模板函数 10.4 随机数的取得 10.5 递归函数 10.6 排序与搜索 10.7 常犯的错误 10.8 本章重点 10.9 本章练习 第11章 预处理命令 11.1 预处理器 11.2 使用#define进行文字取代 11.3 使用#define设置宏命令 11.4 条件编译 11.5 其他与编译器有关的预处理命令 11.6 常犯的错误 11.7 本章重点 11.8 本章练习 第12章 数据流与文件的存取 12.1 数据流 12.2 文件的存取 12.3 文件的存取模式 12.4 数据的读取与写入 12.5 文件内容的位置标记 12.6 将文件的存取写成函数 12.7 常犯的错误 12.8 本章重点 12.9 本章练习 第13章 输出格式 13.1 使用格式操作符设置输出格式 13.2 输出格式设置间的交互作用 13.3 3 种格式设置语法的比较 13.4 文件存储格式的设置 13.5 矩阵和向量间的操作 13.6 常犯的错误 13.7 本章重点 13.8 本章练习 第14章 程序计时 14.1 程序的基本计时方法 14.2 更精确的程序计时方法 14.3 常犯的错误 14.4 本章重点 14.5 本章练习 第15章 struct与数据结构 15.1 struct的声明和使用 15.2 struct构成的数组 15.3 struct数据型与函数参数的传递 l5.4 struct实例的动态声明 15.5 指针成员与数据结构 15.6 union数据型 15.7 enum数据型 15.8 常犯的错误 15.9 本章重点 15.10 本章练习 第16章 命名空间 16.1 因为名称相同而造成的问题 16.2 命名空间的基本语法 16.3 命名空间成员的存取 16.4 使用“using指令”和“using声明”以存取命名空间的成员 16.5 标准命名空间 16.6 未命名的命名空间 16.7 常犯的错误 16.8 本章重点 16.9 本章练习 第17章 异常处理 17.1 异常及其特性 17.2 异常处理的基本语法 17.3 异常的处理过程 17.4 抛出enum实例作为异常对象 17.5 抛出所定义的对象 17.6 常犯的错误 17.7 本章重点 17.8 本章练习 PARTⅢ 面向对象程序设计 第18章 对象 18.1 程序设计方法的演进 18.2 抽象化和数据的隐藏 18.3 对象的关系 18.4 以对象为基础的银行账户操作程序范例 18.5 以对象为基础的电梯操作仿真范例 18.6 友元函数 18.7 常犯的错误 18.8 本章重点 18.9 本章练习 第19章 组合与继承 19.1 既有的再利用 19.2 组合(Composition) 19.3 组合对象的构造函数和析构函数 19.4 继承(Inheritance) 19.5 protected成员 19.6 派生所定义的对象的构造和析构次序 19.7 混合组合和继承以建立新的 19.8 常犯的错误 19.9 本章重点 19.10 本章练习 第20章 多态与虚拟函数 20.1 多态的基本概念 20.2 后期连接与虚拟函数 20.3 VPTR和VTABLE 20.4 纯虚拟函数与抽象 20.5 重载虚拟函数 20.6 虚拟析构函数 20.7 常犯的错误 20.8 本章重点 20.9 本章练习 第21章 运算符重载 21.1 运算符使用的基本概念 21.2 补充几个使用上的要点 21.3 使用成员函数重载二元运算符 21.4 使用friend函数重载二元运算符 21.5 重载一元运算符 21.6 含有指针数据成员 21.7 等效阻抗的计算 21.8 常犯的错误 21.9 本章重点 21.10 本章练习 第22章 面向对象的字符串处理 22.1 C风格的字符串和面向对象的string 22.2 String对象的定义 22.3 字符串的更改、清除、剪接与部分复制 22.4 字符串之间的查找和比较 22.5 字符串对象与C.style孚符串的互换 22.6 常犯的错误 22.7 本章重点 22.8 本章练习 第23章 模板向量和矩阵的定义 23.1 向量 23.2 Vector模板 23.3 矩阵 23.4 Matrix模板 23.5 对象数组的动态创造和删除 23.6 常犯的错误 23.7 本章重点 23.8 本章练习 第24章 泛型程序设计简介 24.1 C++标准模板连接库(STL) 24.2 STL的主要内容 24.3 使用STL的vector·容器 24.4 使用STL处理字符串数组 24.5 使用complex容器处理复数数据 24.6 常犯的错误 24.7 本章重点 24.8 本章练习 第25章 最优化问题的求解 25.1 最优化问题 25.2 Simplex最优化求解法 25.3 最优化演算的C++程序结构 25.4 没有约束条件的最优化问题实例 25.5 有约束条件的三维最优化问题 25.6 曲线拟合问题 25.7 常犯的错误 25.8 本章重点 25.9 本章练习 第26章 常微分方程式的数值解 26.1 常微分方程式 26.2 使用C++解初始值问题的程序结构 26.3 ODE初始值问题的数值解 26.4 程序计算结果的输出 26.5 van der Pol微分方程式的数值解 26.6 三阶ODE动态系统的数值仿真 26.7 常犯的错误 26.8 本章重点 26.9 本章练习 附录 附录A C++的74个关键字 附录B C++的运算符 附录C 标准链接库的常用头文件 附录D 函数的参数传递格式 附录E 重要名词英对照表 附录F 重要参考网址 参考文献
目录 第1初级 第1章 初识C++ 1.1 c++简介 1.2 C++与C的区别 1.3 学习c++之前需要先学C吗 1.4 c++与其他语言的区别 1.5 c++的版本以及安装问题 第2章 做一个最简短的C4-+程序 2.1 简单的屏幕输出小程序 2.2 输出语句的使用 2.3 std::介绍 2.4 iostream与iostream.h的区别 2.5 重名问题 2.6 注释 2.7 总结 第3章 初步了解函数 3.1 一个简单的函数 3.2 函数的传参 3.3 函数的返回值、参数与变量 3.4.函数的声明与定义 3.5 局部变量 3.6 全局变量 3.7 总结 第4章 C4-+数据型 4.1 变量的定义 4.2 将变量及数据存储内存 4.3 布尔型变量 4.4 字符型变量 4.5 wchart双字符型变量 4.6 整型概述 4.7 整型变量的定义 4.8 浮点型变量 4.9 常量 4.10枚举型常量 第5章 if语句与运算符 5.1 语句的定义 5.2 块的定义 5.3 表达式的定义 5.4 运算符的定义 5.4.1 赋值运算符的定义 5.4.2 数学运算符的定义 5.4.3 赋值运算符与数学运算符的联合 5.5 自加与自减 5.5.1 前置 5.5.2 后置 5.6 表达式的优先级 5.7 关系运算符 5.8 if语句 5.8.1 else语句 5.8.2 elseif语句 5.8.3 if语句的嵌套 5.9 逻辑运算符及其使用 5.9.1 逻辑“与” 5.9.2 逻辑“或” 5.9.3 逻辑“非” 5.9.4 逻辑运算符的优先级 5.9.5 运算式的真假关系 5.1 0三目运算符 5.1 0.1 三目运算符的优先问题 5.1 0.2 三目运算符的使用问题 5.1 0.3 三目运算符的型别问题 5.1 0.4 三目运算符在字符型变量的应用 5.1 1复杂嵌套的if语句 5.1 2总结 第6章 面向对象 6.1 面向对象程序语言的主要特征 6.2 对象成员 6.3 对象成员的使用方法及区别 6.3.1 声明一个 6.3.2 命名习惯 6.3.3 定义一个对象 6.3.4 对象的区别 6.3.5 对象成员的关系 6.3.6 不要给赋值 6.3.7 对象只能调用存在的方法 6.4 公有 6.5 私有 6.6 成员函数的声明和定义 6.7 内联函数 6.7.1 普通内联函数 6.7.2 内联成员函数 6.8 头文件与源文件 6.9 const成员函数 6.10构造函数 6.11默认构造函数 6.12析构函数 6.13析构对象数组 6.14总结 第7章 循环语句 7.1 循环语句的前身——goto语句 7.2 慎用goto语句 7.3 while语句 7.3.1 带运算符的while语句 7.3.2 以字符为条件的while语句 7.3.3 限定while循环的次数 7.3.4 continue语句 7.3.5 break语句 7.3.6 永不休止的while循环 7.4. do……while循环 7.5 for循环 7.5.1 灵活的for循环 7.5.2 条件为空的for循环 7.5.3 执行为空的for循环 7.5.4 嵌套的for循环 7.6 switch语句 7.6.1 switch语句常见错误 7.6.2 switch的菜单功能 7.7 总结 第8章 指针 8.1 什么是地址 8.2 用指针来保存地址 8.2.1 空指针 8.2.2 指针与变量型 8.2.3 用指针来访问值 8.2.4 指针地址、指针保存的地址和 该地址的值 8.2.5 指针对数值的操作 8.2.6 更换指针保存的地址 8.3 为什么使用指针 8.3.1 栈和堆 8.3.2 用指针创建堆空间 8.3.3 用指针删除堆空间 8.4 动态内存 8.4.1 内存泄漏 8.4.2 在堆创建对象 8.4.3 在堆删除对象 8.4.4 访问堆的数据成员 8.4..5 在构造函数开辟内存空间 8.4.6 对象在栈与堆的不同 8.5 this指针 8.6 指针的常见错误 8.7 指针运算 8.7.1 指针的加减运算 8.7.2 指针的赋值运算 8.7 _3指针的相减运算 8.7.4 指针的比较运算 8.8 指针 8.8.1 常量指针 8.8.2 指向常量的指针 8.8.3 指向常量的常指针 8.9 总结 第9章 引用 9.1 什么是引用 9.1.1 引用的地址 9.1.2 引用就是别名常量 9.1.3 引用对象 9.1 4空引用 9.2 函数的参数传递 9.2.1 按值传递 9.2.2 按址传递 9.2.3 按别名传递 9.2.4 让函数返回多个值 9.3 传递对象 9.3.1 按值来传递对象 9.3.2 利用指针来传递对象 9.3.3 利用cost指针来传递对象 9.3.4 利用引用来传递对象 9.3.5 到底是使用引用还是指针 9.3.6 引用和指针可以一块用 9.4 引用应注意的问题 9.4.1 引用容易犯的错误 9.4.2 引用一个按值返回的堆对象 9.4 -3引用一个按别名返回的堆对象 9.4.4 在哪里创建,就在哪里释放 9.5 总结 第10章 深入函数 10.1 函数重载 10.1.1 普通函数的重载 10.1.2 成员函数的重载 10.2 函数的默认参数 10.3 重载构造函数 10.3.1 成员变量的赋值与初始化 10.3.2 成员变量的初始化与构造函数 10.3.3 复制构造函数 10.3.4 构造函数和new运算符 10.3.5 再谈默认构造函数 10.4.析构函数和delete运算符 10.4..1 默认析构函数 10.4.2 调用构造函数进行型转换 10.5 浅层复制构造函数 10.6 深层复制构造函数 第11章 运算符重载 11.1 运算符重载 11.2 在成员函数实现自加 11.3 重载前置自加运算符 11.4 创建临时对象 11.5 创建无名临时对象 11.6 取消创建临时对象 11.7 重载后置自加运算符 11.8 重载加法运算符函数operator+ 11.9 重载赋值运算符函数operator 11.10转换型运算符 11.10.1 温习调用构造函数实现的型转换 11.10.2 通过构造函数将变量转换为一个对象成员变量 11.10.3 通过operator关键字进行转换 11.11什么可以重载,什么不可以重载 第12章 继承 12.1 什么是继承和派生 12.1.1 复杂的继承和派生 12.1.2 继承和派生如何在C++实现 12.1.3 继承的种及语法 12.1.4 单一继承 12.2 公有型、保护型和私有型 12.3 访问权限 12.4 多重继承 12.5 继承的构造与析构 12.6 合理利用基构造函数 12.7 继承和重载的两义性问题 12.7.1 多重继承容易产生两义性 12.7.2 继承的重载 12.7.3 两义性的归属问题 12.7.4 减少两义性产生的混淆问题 12.7.5 虚基不会产生两义性 12.8 总结 第13章 虚函数 13.1 指向子对象的父指针 13.2 虚函数 13.3 拳击游戏 13.4 继承是否可以实现多态性 13.5 在编译时的静态联编 13.6 在运行时的静态联编 13.7 在运行时的动态联编 13.8 在编译时的动态联编 13.9 调用虚函数 13.9.1 在虚函数调用成员函数 13.9.2 3种调用虚函数的方式比较 13.10被继承的虚函数仍然是虚函数 13.11系统是如何调用虚函数的 13.12在虚函数使用成员名限定 13.13虚析构函数 13.14总结 第14章 数组 14.1 数组的基本用法 14.1.1 什么是数组 14.1.2数组元素 14.1.3数组下标越界 14.1.4 倒序输出 14.1.5 将数组的下标定义为常量 14.1.6 手动操作数组元素 14.1.7 数组的初始化 14.2 数组的用途 14.2.1 求平均考试成绩 14.2.2 兔子繁殖问题 14.2.3 数字排序问题 14.3 数组在内存的分布 14.4.输出数组名 14.5 数组名与函数 14.6 传递与接收 14.7 数组与函数 14.7.1 函数传参实例一——求数组所有元素的和 14.7.2 函数传参实例二——用递增法查找数据 14.7.3 函数传参实例三——用二分算法查找数据 14.7.4 函数传参实例四——判断数组是否按照顺序排列 14.7.5 函数传参实例五——判断数组排列方式后执行不同的函数 14.8 数组在对象的传参 14.9 对象数组 14.10 在对象数组初始化成员变量 14.11 指针数组 14.12 枚举常量与数组 14.13 多维数组 14.14 多维数组的初始化 14.15 字符数组 14.16 重载数组下标操作符 14.17 总结 第15章 链表 15.1 声明链表结构 15.2 简单的图书链表 15.2.1 图书链表 15.2.2 的链表 15.3 动态链表 15.3.1 动态链表的建立 15.3.2 解决输入字符造成死循环的问题 15.3.3 动态链表的显示 15.3.4 动态链表的删除 第16章 多态性 第17章 的特殊成员 第2 高级 第19章 代码重用 第20 高级 第20章 友元与嵌套 第21章 流 第22章 命名空间 第23章 模板 第24章 异常和错误处理 第25章 补充知识 附录A ASCII码对照表 附录B C++的关键字 附录C C++常用头文件列表 附录D 运算符的优先级 后记
目录 第1初级 第1章 初识C++ 1.1 c++简介 1.2 C++与C的区别 1.3 学习c++之前需要先学C吗 1.4 c++与其他语言的区别 1.5 c++的版本以及安装问题 第2章 做一个最简短的C4-+程序 2.1 简单的屏幕输出小程序 2.2 输出语句的使用 2.3 std::介绍 2.4 iostream与iostream.h的区别 2.5 重名问题 2.6 注释 2.7 总结 第3章 初步了解函数 3.1 一个简单的函数 3.2 函数的传参 3.3 函数的返回值、参数与变量 3.4.函数的声明与定义 3.5 局部变量 3.6 全局变量 3.7 总结 第4章 C4-+数据型 4.1 变量的定义 4.2 将变量及数据存储内存 4.3 布尔型变量 4.4 字符型变量 4.5 wchart双字符型变量 4.6 整型概述 4.7 整型变量的定义 4.8 浮点型变量 4.9 常量 4.10枚举型常量 第5章 if语句与运算符 5.1 语句的定义 5.2 块的定义 5.3 表达式的定义 5.4 运算符的定义 5.4.1 赋值运算符的定义 5.4.2 数学运算符的定义 5.4.3 赋值运算符与数学运算符的联合 5.5 自加与自减 5.5.1 前置 5.5.2 后置 5.6 表达式的优先级 5.7 关系运算符 5.8 if语句 5.8.1 else语句 5.8.2 elseif语句 5.8.3 if语句的嵌套 5.9 逻辑运算符及其使用 5.9.1 逻辑“与” 5.9.2 逻辑“或” 5.9.3 逻辑“非” 5.9.4 逻辑运算符的优先级 5.9.5 运算式的真假关系 5.1 0三目运算符 5.1 0.1 三目运算符的优先问题 5.1 0.2 三目运算符的使用问题 5.1 0.3 三目运算符的型别问题 5.1 0.4 三目运算符在字符型变量的应用 5.1 1复杂嵌套的if语句 5.1 2总结 第6章 面向对象 6.1 面向对象程序语言的主要特征 6.2 对象成员 6.3 对象成员的使用方法及区别 6.3.1 声明一个 6.3.2 命名习惯 6.3.3 定义一个对象 6.3.4 对象的区别 6.3.5 对象成员的关系 6.3.6 不要给赋值 6.3.7 对象只能调用存在的方法 6.4 公有 6.5 私有 6.6 成员函数的声明和定义 6.7 内联函数 6.7.1 普通内联函数 6.7.2 内联成员函数 6.8 头文件与源文件 6.9 const成员函数 6.10构造函数 6.11默认构造函数 6.12析构函数 6.13析构对象数组 6.14总结 第7章 循环语句 7.1 循环语句的前身——goto语句 7.2 慎用goto语句 7.3 while语句 7.3.1 带运算符的while语句 7.3.2 以字符为条件的while语句 7.3.3 限定while循环的次数 7.3.4 continue语句 7.3.5 break语句 7.3.6 永不休止的while循环 7.4. do……while循环 7.5 for循环 7.5.1 灵活的for循环 7.5.2 条件为空的for循环 7.5.3 执行为空的for循环 7.5.4 嵌套的for循环 7.6 switch语句 7.6.1 switch语句常见错误 7.6.2 switch的菜单功能 7.7 总结 第8章 指针 8.1 什么是地址 8.2 用指针来保存地址 8.2.1 空指针 8.2.2 指针与变量型 8.2.3 用指针来访问值 8.2.4 指针地址、指针保存的地址和 该地址的值 8.2.5 指针对数值的操作 8.2.6 更换指针保存的地址 8.3 为什么使用指针 8.3.1 栈和堆 8.3.2 用指针创建堆空间 8.3.3 用指针删除堆空间 8.4 动态内存 8.4.1 内存泄漏 8.4.2 在堆创建对象 8.4.3 在堆删除对象 8.4.4 访问堆的数据成员 8.4..5 在构造函数开辟内存空间 8.4.6 对象在栈与堆的不同 8.5 this指针 8.6 指针的常见错误 8.7 指针运算 8.7.1 指针的加减运算 8.7.2 指针的赋值运算 8.7 _3指针的相减运算 8.7.4 指针的比较运算 8.8 指针 8.8.1 常量指针 8.8.2 指向常量的指针 8.8.3 指向常量的常指针 8.9 总结 第9章 引用
内容简介 本书采用生动轻松的语言,深入阐述了C++语言和面向对象程序设计技术。书设计了超过115个完整的经过教学测试的代码示例,不仅分析了这些示例的代码片段,而且还解释了如何把它们组成一个完整的程序。此外,各章后面都提供了大量练习,有助于加强读者对相关内容的理解。 本书图文并茂,通俗易懂,真正做到寓教于乐,是一本难得的C++面向对象设计入门教材。 -------------------------------------------------------------------------------- 作者简介 Barbara Johnston,任教于新墨西哥央社区学院,负责教授AA学位的计算机编程课程。她有20多年的软件开发和教学经验,目前兼任Rapid Imaging SoftwarrtCAM3D实时感知软件。e公司的软件开发工程师,负责开发了美国军用无人驾驶飞行器所使用的SmartCAM3D实时感知软件。 -------------------------------------------------------------------------------- 目录 出版者的话 译者序 前言 第1章 C++概述与软件开发 1.1 什么是C语言C++ 1.1.1 C和C++历史回顾 1.1.2 C/C++是一门编译语言 1.1.3 为什么许多程序员都选择C++ 1.2 什么是面向对象 1.2.1 C++程序并不一定是面向对象的 1.2.2 一个简单的面向对象程序示例 1.2.3 面向对象的软件更有优势 1.3 结构化设计与面向对象设计 1.3.1 ATM——结构化设计 1.3.2 采用面向对象方法的ATM——究竟是谁的任务 1.3.3 汽车维护——结构化设计 1.3.4 采用面向对象方法的汽车维护——究竟是谁的任务 1.4 软件开发技术概述 1.5 问题发现与解决 复习题 第2章 C++的入门知识 2.1 编程基础 2.1.1 算法设计 2.1.2 正确的软件开发步骤 2.2 专业术语及工程创建 2.3 C++程序的一般格式 2.3.1 “Hello World!”程序 2.3.2 “How’s the Weather?”程序 2.4 程序的数据及数据型 2.4.1 C++的数据型 2.4.2 容器=数据型,标签=变量名 2.4.3 数据型修饰符 2.4.4 问题分析:整型数据究竟有多大 2.5 C++的变量声明 2.5.1 C++的命名规则 2.5.2 在哪里声明变量 2.6 C++的运算符 2.6.1 计算路程的程序 2.6.2 从键盘输入程序所需数据 2.6.3 赋值运算符 2.6.4 运算符的优先级 2.6.5 数据型及其存储的值 2.6.6 算术运算符 2.6.7 自增运算符和自减运算符 2.6.8 复合赋值运算符 2.7 #define、const和数据型转换 2.7.1 #define预处理指令 2.7.2 const修饰符 2.7.3 const比#define好吗 2.7.4 数据型转换 2.8 关于键盘输入和屏幕输出的更多内容 2.8.1 转义序列 2.8.2 ios格式标记 2.8.3 流的IO控制符 2.9 开始使用类和对象C++string 2.10 练习 复习题 第3章 控制语句和循环 3.1 关系运算符和逻辑运算符 3.2 if语句 3.2.1 if-else语句 3.2.2 问题分析:在if语句使用大括号 3.2.3 if-else if-else语句 3.2.4 低效的编程方法 3.2.5 if-else程序示例 3.2.6 嵌套if-else语句 3.2.7 条件运算符“?” 3.3 switch语句 3.4 循环 3.4.1 括号的用法 3.4.2 无限循环 3.5 for循环 3.5.1 不要改变循环索引 3.5.2 for循环示例 3.6 while循环 3.7 do while循环 3.8 跳转语句 3.8.1 break语句 3.8.2 continue语句 3.9 问题发现与解决 3.9.1 五个常见错误 3.9.2 调试程序 3.10 C++与vector 3.11 总结 3.12 练习 复习题 第4章 函数一:基础 4.1 C++的函数 4.1.1 只由一个main函数构成的程序 4.1.2 包含多个函数的程序 4.1.3 函数是个好东西 4.1.4 三个重要的问题 4.2 函数:基本格式 4.3 函数的编写要求 4.3.1 你想住在C++旅馆吗 4.3.2 函数为先 4.3.3 函数声明或函数原型 4.3.4 函数定义、函数标题行与函数体 4.3.5 函数调用 4.3.6 传值调用 4.3.7 问题分析:未声明的标识符 4.4 重载函数 4.5 具有默认输入参数列表的函数 4.6 局部变量、全局变量和静态变量 4.6.1 局部变量 4.6.2 块范围 4.6.3 全局变量 4.6.4 危险的全局变量 4.6.5 问题分析:全局变量y0、y1与cmath 4.6.6 静态变量 4.7 C++stringstream 4.8 总结 4.9 练习 复习题 第5章 函数二:变量地址、指针以及引用 5.1 数据变量和内存 5.1.1 sizeof运算符 5.1.2 预留内存 5.1.3 计算机内存和十六进制 5.2 取地址运算符& 5.3 指针 5.4 函数、指针以及间接运算符 5.4.1 解决思路 5.4.2 指针和函数 5.4.3 有效处理大型数据 5.5 函数和引用 5.5.1 复习:两种机制 5.5.2 为什么要强调指针的重要性 5.6 queue 5.7 总结 5.8 练习 复习题 第6章 数组 6.1 使用单个数据变量 6.2 数组基础 6.2.1 数组的索引值从0开始 6.2.2 使用for循环和数组来实现的电话账单程序 6.2.3 数组的声明和初始化 6.2.4 数组越界==严重的问题 6.2.5 vector与数组的比较 6.3 数组和函数 6.3.1 每个数组都有一个指针 6.3.2 数组指针 6.3.3 向函数传递数组:最开始的引用调用 6.3.4 利用数组和函数生成随机数并进行排序 6.4 C字符串,也称为字符数组 6.4.1 字符数组的初始化 6.4.2 null字符 6.4.3 C字符串的输入 6.4.4 C++提供的字符数组函数 6.5 多维数组 6.5.1 二维数组的初始化 6.5.2 嵌套的for循环和二维数组 6.5.3 利用二维数组来实现Bingo游戏 6.6 多维数组和函数 6.6.1 改进的Bingo卡片程序 6.6.2 白雪公主:利用二维数组来存储姓名 6.7 利用数据文件对数组赋值 6.8 总结 6.9 练习 复习题 第7章 类和对象 7.1 我们所了解的类和对象 7.2 编写自己的 7.2.1 入门实例:自定义日期 7.2.2 第一个C++:Date 7.2.3 揭开的生命之谜 7.2.4 set和get函数的作用与VolumeCalc 7.2.5 PICalculator 7.3 作为成员对象 7.4 的析构函数 7.5 对象数组 7.6 重载运算符与对象 7.7 指针、引用和 7.7.1 指针和引用实例 7.7.2 处理日期和时间的程序实例 7.8 总结 7.9 练习 复习题 第8章 继承和虚函数 8.1 为什么继承如此重要 8.1.1 IceCreamDialog实例 8.1.2 Counter实例 8.2 继承基础 8.2.1 Counter和DeluxeCounter实例 8.2.2 保护成员 8.2.3 员工、老板和CEO 8.3 访问控制符的规范和多继承 8.4 继承、构造和析构 8.4.1 构造函数和析构函数回顾 8.4.2 基和派生的默认构造函数——没有参数 8.4.3 在重载的构造函数使用参数 8.4.4 基和派生的析构函数 8.4.5 医生也是人 8.4.6 关于派生和基构造函数的规则 8.5 多态和虚函数 8.5.1 多态——同一个接口,不同的行为 8.5.2 什么是虚函数 8.5.3 虚函数的作用 8.6 总结 8.7 练习 复习题 附录A 学习使用Visual C++2005Express Edition 附录B C++关键字表 附录C C++运算符 附录D ASCII码 附录E 位、字节、内存和十六进制表示 附录F 文件输入/输出 附录G 部分C++ 附录H 多文件程序 附录I Microsoft visual C++2005Express Edition的调试器 术语表
《现代C++程序设计(原书第2版)》图文并茂,通俗易懂,真正做到寓教于乐,是一本难得的C++面向对象设计入门教材。 出版者的话 译者序 前言 第1章 C++概述与软件开发 1.1 什么是C语言C++ 1.1.1 C和C++历史回顾 1.1.2 C/C++是一门编译语言 1.1.3 为什么许多程序员都选择C++ 1.2 什么是面向对象 1.2.1 C++程序并不一定是面向对象的 1.2.2 一个简单的面向对象程序示例 1.2.3 面向对象的软件更有优势 1.3 结构化设计与面向对象设计 1.3.1 ATM——结构化设计 1.3.2 采用面向对象方法的ATM——究竟是谁的任务 1.3.3 汽车维护——结构化设计 1.3.4 采用面向对象方法的汽车维护——究竟是谁的任务 1.4 软件开发技术概述 1.5 问题发现与解决 复习题 第2章 C++的入门知识 2.1 编程基础 2.1.1 算法设计 2.1.2 正确的软件开发步骤 2.2 专业术语及工程创建 2.3 C++程序的一般格式 2.3.1 “Hello World!”程序 2.3.2 “How’s the Weather?”程序 2.4 程序的数据及数据型 2.4.1 C++的数据型 2.4.2 容器=数据型,标签=变量名 2.4.3 数据型修饰符 2.4.4 问题分析:整型数据究竟有多大 2.5 C++的变量声明 2.5.1 C++的命名规则 2.5.2 在哪里声明变量 2.6 C++的运算符 2.6.1 计算路程的程序 2.6.2 从键盘输入程序所需数据 2.6.3 赋值运算符 2.6.4 运算符的优先级 2.6.5 数据型及其存储的值 2.6.6 算术运算符 2.6.7 自增运算符和自减运算符 2.6.8 复合赋值运算符 2.7 #define、const和数据型转换 2.7.1 #define预处理指令 2.7.2 const修饰符 2.7.3 const比#define好吗 2.7.4 数据型转换 2.8 关于键盘输入和屏幕输出的更多内容 2.8.1 转义序列 2.8.2 ios格式标记 2.8.3 流的IO控制符 2.9 开始使用类和对象C++string 2.10 练习 复习题 第3章 控制语句和循环 3.1 关系运算符和逻辑运算符 3.2 if语句 3.2.1 if-else语句 3.2.2 问题分析:在if语句使用大括号 3.2.3 if-else if-else语句 3.2.4 低效的编程方法 3.2.5 if-else程序示例 3.2.6 嵌套if-else语句 3.2.7 条件运算符“?” 3.3 switch语句 3.4 循环 3.4.1 括号的用法 3.4.2 无限循环 3.5 for循环 3.5.1 不要改变循环索引 3.5.2 for循环示例 3.6 while循环 3.7 do while循环 3.8 跳转语句 3.8.1 break语句 3.8.2 continue语句 3.9 问题发现与解决 3.9.1 五个常见错误 3.9.2 调试程序 3.10 C++与vector 3.11 总结 3.12 练习 复习题 第4章 函数一:基础 4.1 C++的函数 4.1.1 只由一个main函数构成的程序 4.1.2 包含多个函数的程序 4.1.3 函数是个好东西 4.1.4 三个重要的问题 4.2 函数:基本格式 4.3 函数的编写要求 4.3.1 你想住在C++旅馆吗 4.3.2 函数为先 4.3.3 函数声明或函数原型 4.3.4 函数定义、函数标题行与函数体 4.3.5 函数调用 4.3.6 传值调用 4.3.7 问题分析:未声明的标识符 4.4 重载函数 4.5 具有默认输入参数列表的函数 4.6 局部变量、全局变量和静态变量 4.6.1 局部变量 4.6.2 块范围 4.6.3 全局变量 4.6.4 危险的全局变量 4.6.5 问题分析:全局变量y0、y1与cmath 4.6.6 静态变量 4.7 C++stringstream 4.8 总结 4.9 练习 复习题 第5章 函数二:变量地址、指针以及引用 5.1 数据变量和内存 5.1.1 sizeof运算符 5.1.2 预留内存 5.1.3 计算机内存和十六进制 5.2 取地址运算符& 5.3 指针 5.4 函数、指针以及间接运算符 5.4.1 解决思路 5.4.2 指针和函数 5.4.3 有效处理大型数据 5.5 函数和引用 5.5.1 复习:两种机制 5.5.2 为什么要强调指针的重要性 5.6 queue 5.7 总结 5.8 练习 复习题 第6章 数组 6.1 使用单个数据变量 6.2 数组基础 6.2.1 数组的索引值从0开始 6.2.2 使用for循环和数组来实现的电话账单程序 6.2.3 数组的声明和初始化 6.2.4 数组越界==严重的问题 6.2.5 vector与数组的比较 6.3 数组和函数 6.3.1 每个数组都有一个指针 6.3.2 数组指针 6.3.3 向函数传递数组:最开始的引用调用 6.3.4 利用数组和函数生成随机数并进行排序 6.4 C字符串,也称为字符数组 6.4.1 字符数组的初始化 6.4.2 null字符 6.4.3 C字符串的输入 6.4.4 C++提供的字符数组函数 6.5 多维数组 6.5.1 二维数组的初始化 6.5.2 嵌套的for循环和二维数组 6.5.3 利用二维数组来实现Bingo游戏 6.6 多维数组和函数 6.6.1 改进的Bingo卡片程序 6.6.2 白雪公主:利用二维数组来存储姓名 6.7 利用数据文件对数组赋值 6.8 总结 6.9 练习 复习题 第7章 类和对象 7.1 我们所了解的类和对象 7.2 编写自己的 7.2.1 入门实例:自定义日期 7.2.2 第一个C++:Date 7.2.3 揭开的生命之谜 7.2.4 set和get函数的作用与VolumeCalc 7.2.5 PICalculator 7.3 作为成员对象 7.4 的析构函数 7.5 对象数组 7.6 重载运算符与对象 7.7 指针、引用和 7.7.1 指针和引用实例 7.7.2 处理日期和时间的程序实例 7.8 总结 7.9 练习 复习题 第8章 继承和虚函数 8.1 为什么继承如此重要 8.1.1 IceCreamDialog实例 8.1.2 Counter实例 8.2 继承基础 8.2.1 Counter和DeluxeCounter实例 8.2.2 保护成员 8.2.3 员工、老板和CEO 8.3 访问控制符的规范和多继承 8.4 继承、构造和析构 8.4.1 构造函数和析构函数回顾 8.4.2 基和派生的默认构造函数——没有参数 8.4.3 在重载的构造函数使用参数 8.4.4 基和派生的析构函数 8.4.5 医生也是人 8.4.6 关于派生和基构造函数的规则 8.5 多态和虚函数 8.5.1 多态——同一个接口,不同的行为 8.5.2 什么是虚函数 8.5.3 虚函数的作用 8.6 总结 8.7 练习 复习题 附录A 学习使用Visual C++2005Express Edition 附录B C++关键字表 附录C C++运算符 附录D ASCII码 附录E 位、字节、内存和十六进制表示 附录F 文件输入/输出 附录G 部分C++ 附录H 多文件程序 附录I Microsoft visual C++2005Express Edit

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烛火萤辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值