12 2018 档案
摘要:1. 关于动态内存分配 (1)new和malloc的区别 区别 new malloc 是否是关键字 关键字,是C++的一部分。被所有的C++编译器支持。 由C库提供的函数,注意是函数,而不是关键字,要依赖C库(cstdlib),在某些系统开发(如嵌入式)中可能不能调用。 分配单位 以具体类型为单位
阅读全文
摘要:1. 什么是抽象类 (1)面向对象中的抽象概念 思考:抽象图形中,图形的面积如何计算? (2)现实中:需要知道具体的图形类型,才能求面积。 (3)Shape只是一个概念上的类型(抽象图形类型),没有具体对象。 2. 面向对象中的抽象类 (1)可用于表示现实世界中的抽象概念 (2)抽象类是一种只能定义
阅读全文
摘要:1. 回归本质 (1)class是一种特殊的结构体(struct) ①在内存中class依旧可以看作变量的集合 ②class与struct遵循相同的内存对齐规则 ③class中的成员函数与成员变量是分开存放的。即每个对象有独立的成员变量,所有对象共享类中的成员函数。 (2)值得思考的问题:两者相等
阅读全文
摘要:1. 函数重写回顾 (1)父类中被重写的函数依然会继承给子类 (2)子类中重写的函数将覆盖父类中的函数 (3)通过作用域分辨符(::)可以访问到父类中的函数 Child c; Parent* p = &c; c.Parent::print(); //从父类中继承 c.print(); //在子类中重
阅读全文
摘要:1. 类型转换函数 (1)C++类中可以定义类型转换函数 (2)类型转换函数用于将类对象转换为其它类型 (3)语法规则: operator Type() //重载类型运算符 { Type ret; //…… return ret; } 【编程实验】类型转换函数初探 42-1.cpp #include
阅读全文
摘要:1. 再论类型转换 (1)标准数据类型之间会进行隐式的类型安全转换 (2)转换规则: 【实例分析】有趣的隐式类型转换 41-1.cpp #include <iostream> using namespace std; int main() { short s ='a'; unsigned int u
阅读全文
摘要:1. ++i和i++真的有区别吗? (1)现代编译器会对代码进行优化 对于基础类型,前置++和后置++的汇编代码几乎是一样的,最终效率完全一样。 (2)优化使得最终的二进制程序更加高效 (3)优化后的二进制程序丢失了C/C++的原生语义 (4)不可能从编译后的二进制程序还原C/C++程序 【编程实验
阅读全文
摘要:1. 逗号操作符(,) (1)逗号表达式用于将多个子表达式连接为一个表达式 (2)逗号表达式的值为最后一个子表达式的值 (3)逗号表达式的前N-1个子表达式可以没有返回值 (4)逗号表达式按照从左向右的顺序计算每个子表达式的值 exp1,exp2,exp3,…,expN; 【实例分析】逗号表达式的示
阅读全文
摘要:1. 逻辑运算符的原生语义 (1)操作数只有两种值(true和false) (2)逻辑表达式不用完全计算就能确定最终值 (3)最终结果只能是true或false 【编程实验】逻辑表达式 38-1.cpp #include <iostream> using namespace std; int fun
阅读全文
摘要:1. 永恒的话题:内存泄漏 (1)动态申请堆空间,用完后不归还 (2)C++语言中没有垃圾回收的机制 (3)指针无法控制所指堆空间的生命周期 【编程实验】内存泄漏 37-1.cpp #include <iostream> #include "IntArray.h" using namespace s
阅读全文
摘要:1. 关于赋值的疑问 (1)疑问 ①编译器为每个类默认重载了赋值操作符 ②默认的赋值操作符仅完成浅拷贝 ③当需要进行深拷贝时必须重载赋值操作符 ④赋值操作符与拷贝构造函数有相同的存在意义 【编程实验】默认赋值操作符重载 36-1.cpp #include <iostream> using names
阅读全文
摘要:1. 为什么需要函数对象 (1)案例 ①编写一个函数,使函数可以获得斐波那契数列每项的值。 ②每调用一次返回一个值 ③函数可根据需要重复使用 【编程实验】第一个解决方案 35-1.cpp #include <iostream> using namespace std; int fib() { sta
阅读全文
摘要:1. 字符串类的兼容性 (1)string类最大限度的考虑了C字符串的兼容性 (2)可以按照使用C字符串的方式使用string对象 string s = "abcedefg"; char c = s[i]; 【编程实验】用C方式使用string类 34-1.cpp #include <iostrea
阅读全文
摘要:1. 历史遗留问题及解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串 ②C语言用字符数组和一组函数实现字符串操作 ③C语言不支持自定义类型,因此无法获得字符串类型 (2)解决方案 ①从C到C++的进化过程引入了自定义类型 ②在C++中可以通过类完成字符串类型的定义 2. 标准库中的字符
阅读全文
摘要:1. 有趣的重载 (1)操作符<<:原义是按位左移,重载“<<”可将变量或常量左移到对象中 【编程实验】重载左移操作符(仿cout类) 32-1.cpp #include <stdio.h> const char endl = '\n'; class Console { public: Consol
阅读全文
摘要:1. 复数类应具有的操作 (1)运算:+、-、*、/ (2)比较:==、!= (3)赋值:= (4)求模:modulus 2. 利用操作符重载 (1)统一复数与实数的运算方式 Complex operator + (const Complex& c); Complex operator - (con
阅读全文
摘要:1. 复数类需要解决的问题 ——下面的复数解决方案是否可行? 不可行,+ 操作符只提供对C++ 基本数据类型的运算,不支持类的相加运算。 【编程实验】复数的加法操作 30-1.cpp #include <stdio.h> class Complex { int a; int b; public: C
阅读全文
摘要:1. 函数重载的回顾 (1)函数重载的本质为相互独立的不同函数 (2)C++中通过函数名和函数参数确定函数调用,函数名和参数列表组成唯一的标识 (3)无法直接通过函数名得到重载函数的入口地址 (4)函数重载必然发生在同一个作用域中 【编程实验】类成员函数指针 #include <iostream>
阅读全文
摘要:1. 友元的概念 (1)友元是C++中的一种关系,友元关系发生在函数与类之间或类与类之间 (2)友元关系是单项的,不能传递 class Point { double x; double y; friend void func(Point& p);//声明func为Point类的友元函数 } void
阅读全文
摘要:1. 构造函数的回顾 (1)关于构造函数 ①类的构造函数用于对象的初始化 ②构造函数与类同名并且没有返回值(思考:无返回值如何判断构造函数的执行结果?) ③构造函数在对象定义时自动被调用 (2)构造函数的真相 ①构造函数只提供自动初始化成员变量的机会,但不能保证初始化逻辑一定成功。它只能决定对象的初
阅读全文
摘要:1、未完成的需求 统计在程序运行期间某个类的对象数目 保证程序的安全性(不能使用全局变量) 随时可以获取当前对象的数目(Failure) 【编程实验】解决方案的尝试 26-1.cpp #include <stdio.h> class Test { public: static int cCount;
阅读全文
摘要:0.C语言的static关键字 https://www.cnblogs.com/hoiday/protected/p/9998577.html (1)static关键字指明变量的“静态”属性——static修饰的局部变量和全局变量存储在程序静态区(静态变量,只能被初始化一次) (2)static关键
阅读全文
摘要:1. 关于析构的疑问 (1)单个对象创建时构造函数的调用顺序 ①调用父类的构造函数(后续课程中讲解) ②调用成员变量的构造函数(调用顺序与声明顺序相同) ③调用类自身的构造函数 ▲析构函数与对应构造函数的调用顺序相反:即类自身的析构→成员变量→父类析构 (2)多个对象的析构:析构函数顺序与构造函数顺
阅读全文
摘要:1. 有趣的问题 (1)程序意图:在Test()中以0作为参数调用Test(int i)来将成员变量mi初始值设置为0. (2)运行结果:成员变量mi的值为随机值(没达到目的!) 【实例分析】有趣的问题 23-1.cpp #include <stdio.h> class Test { private
阅读全文
摘要:1. 对象的销毁 (1)对象的销毁 生活中的对象都是被初始化后才上市的(从而引入了构造函数) 生活中的对象被销毁前会做一些清理工作 (2)问题:C++中如何清理需要销毁的对象? 一般而言,需要销毁的对象都应该做清理 解决方案: 为每个类都提供一个public的free函数 对象不再需要时立即调用fr
阅读全文
摘要:1. 对象的构造顺序 ———C++中的类可以定义多个对象,那么对象构造顺序是怎样的? (1)对于局部对象:当程序执行流到达对象的定义语句时进行构造 (2)对于堆对象 ①当程序执行流到达new语句时创建对象 ②使用new创建对象将自动触发构造函数的调用 (3)对于全局对象 ①对象的构造顺序是不确定的
阅读全文
摘要:1. 类成员的初始化 (1)C++中提供了初始化列表,可以对类的成员变量进行初始化 (2)语法规则: ClassName::ClassName():m1(v1), m2(v2,v3),m3(v3) { //其它初始化操作 } (3)注意事项 ①成员的初始化顺序与成员的声明顺序相同。而与初始化列表中的
阅读全文
摘要:1. 两个特殊的构造函数 无参构造函数 拷贝构造函数 参数形式 没有参数的构造函数 参数为const class_name&的构造函数 默认情况 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空 当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变
阅读全文
摘要:1. 带参数的构造函数 (1)构造函数可以根据需要定义参数 (2)一个类中可以存在多个重载的构造函数 (3)构造函数的重载遵循C++重载规则 【友情提示】对象的定义和声明不同 ①对象定义:申请对象的内存空间并调用构造函数(如Test t;//定义并调用构造函数) ②对象声明:告诉编译器己经存在一个对
阅读全文
摘要:1. 对象的初始化 (1)从程序设计的角度看,对象只是变量,因此: ①在栈上创建对象时,成员变量初始化为随机值 ②在堆上创建对象时,成员变量初始化为随机值 ③在静态存储区创建对象时,成员变量初始化为0值 【编程实验】成员变量的初始化 17-1.cpp #include <stdio.h> class
阅读全文
摘要:1. 类的关键字 (1)struct在C语言中己经有了自己的含义,必须继续兼容 (2)在C++中提供了新的关键字class用于类定义 (3)class和struct的用法完全相同 用struct定义的类中所有成员默认访问级别为public 用class定义的类中所有成员默认访问级别为private
阅读全文
摘要:1. 封装的基本概念 (1)类通常分为两个部分:类的实现细节、类的使用方式。 当使用类时,不需要关心其实现细节 当创建类时,才需要考虑其内部实现细节 (2)根据经验,并不是类的每个属性都是对外公开的,但一些属性是对外公开的。 (3)必须在类的表示法中定义属性和行为的公开级别:类似文件系统中文件的限制
阅读全文
摘要:1. 类之间的基本关系 (1)继承 ① 从已存在类细分出来的类和原类之间具有继承关系(is-a) ② 继承的类(子类)拥有原类(父类)的所有属性和行为 (2)组合 ① 一些类的存在必须依赖于其它的类,这种关系叫组合 ② 组合的类在某一个局部上由其它的类组成 2. 类的表示法 类的表示法: 类的表示法
阅读全文
摘要:1.面向对象基本概念 ——日常生活中,我们都习惯于对事物进行分类。那么,这种分类的思想是否可以引入程序设计中呢? (1)面向对象的意义在于 ①将日常生活中习惯的思维方式引入程序设计中 ②将需求中的概念直观的映射到解决方案中 ③以模块为中心构建可复用的软件系统 ④提高软件产品的可维护性和可扩展性 (2
阅读全文
摘要:1. 关于const的疑问 (1)const常量的判别准则 ①只有用字面量初始化的const常量才会进入符号表,如const int i = 1; ②使用其它变量初始化的const常量仍然是只读变量。如const int a = b;//a为只读变量 ③被volatile修饰的const常量不会进入
阅读全文
摘要:1. C方式的强制类型转换 (1)强制类型转换形式 ①(Type)(Expression) ②Type(Expression) //老式的 【编程实验】粗暴的类型转换 11-1.cpp #include <stdio.h> typedef void PF(int); struct Point { i
阅读全文
摘要:1. 动态内存分配 (1)C++通过new关键字进行动态内存申请,是以类型为单位来申请空间大小的 (2)C++通过delete关键字用于内存释放 ▲注意释放数组时要加[],否则只释放这个数组中的第1个元素。 【实例分析】C++中的动态内存分配 10-1.cpp #include <stdio.h>
阅读全文
摘要:1. 函数重载与函数指针 (1)将重载函数名赋值给函数指针时 ①根据重载规则挑选与函数指针参数列表一致的候选者 ②严格匹配候选者的函数类型与函数指针的函数类型(所谓严格匹配,即函数参数及返回值都匹配) 【编程实验】函数重载 VS 函数指针 9-1.cpp #include <stdio.h> #in
阅读全文
摘要:1. 重载的概念 (1)同一个标识符在不同的上下文有不同的意义。 (2) 重载在自然语言中是随处可见的,那么程序设计中是否也有重载呢? 2. 函数的重载的概念(Function Overload) (1)用同一个函数名定义不同的函数 (2)当函数名和不同的参数搭配时,函数的含义不同 【编程实验】函数
阅读全文
摘要:1. 函数参数的默认值 (1)C++中可以在函数声明时为参数提供一个默认值(注意是函数声明,不能在函数定义中提供) (2)当函数调用时没有提供参数的值,则使用默认值 【实例分析】默认参数值初探 7-1.cpp #include <stdio.h> //默认值只能在函数声明时提供 int mul(in
阅读全文
摘要:1. const常量与宏常量回顾 (1)C++中的const常量可以替代宏常数定义,如: const int A = 3; ←→ #define A 3 (2)C++中是否有解决方案,可以用来替代宏代码片段呢? 2. 内联函数 2.1 内联函数的定义 (1)C++编译器可以将一个函数进行内联编译,被
阅读全文
摘要:1. 引用的意义 (1)引用作为变量别名而存在,因此在一些场合可以代替指针 (2)引用相对于指针来说,具有更好的可读性和实用性 2. 特殊的引用:const引用 (1)在C++中可以声明const引用 (2)const Type& name = var; (3)const引用让变量拥有只读属性 (4
阅读全文
摘要:1. 布尔类型 (1)C++在C语言的基本类型系统之上增加了bool,其可能的取值只有true(1)和false(0) (2)理论上bool只占用一个字节 (3)bool类型是基本类型,可以用来定义bool型的全局变量、常量、指针和数组。。。。。。。。。。。 (3)C++编译器会将非0值转换true
阅读全文
摘要:1. C语言中的const变量(const修饰变量) (1)const修饰的变量是只读的,使得变量具有只读属性,但本质还是变量 (2)const定义的并不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。 (3)const修饰的局部变量在栈上分配空间,全局变量在只读存储区分配空间 (4)
阅读全文
摘要:1. C与C++的关系 (1)C++继承了所有的C特性,并在C的基础上提供了更多的语法和特性。 (2)C++的设计目标是运行效率与开发效率的统一,它更强调的是语言的实用性。 2. C到C++ 的升级 2.1 变量的定义 ① C++中所有的变量都可以在需要使用时再定义(C++更强调语言的实用性) ②
阅读全文
摘要:1. 回顾历史 (1)UNIX操作系统诞生之初是直接用汇编语言写成的。随着UNIX的发展,汇编语言的开发效率成为一个瓶劲。 (2)1971年,Ken Thompson和Denis Ritchie对B语言(解释型)进行改良,使其能够直接产生机器码,C语言(编译型)诞生。 (3)UNIX开始用C语言重写
阅读全文
摘要:1. 函数类型 (1)C语言中的函数有自己特定的类型,这个类型由返回值、参数类型和参数个数共同决定。如int add(int i,int j)的类型为int(int,int)。 (2)C语言中通过typedef为函数类型重命名 typedef type name(parameter list); /
阅读全文
摘要:1. 数组参数退化为指针的意义 (1)C语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C语言以高效作是最初的设计目标,所以这种方法是不可取的。 (2)参数位于栈上,太大的数组拷贝将导致栈溢出。 (3)将数组名看做常量指针,传递的是数组的首元素地址,
阅读全文
摘要:1. 指向指针的指针(多维指针) (1)指针的本质是变量,会占用一定的内存空间 (2)可以定义指针的指针来保存指针变量的地址值 (3)指针是个变量,同样也存在传值调用与传址调用 【实例分析】重置动态空间的大小 1 #include <stdio.h> 2 3 #include <malloc.h>
阅读全文
摘要:1. 数组的类型 (1)C语言中的数组有自己特定的类型 (2)数组的类型由元素类型和数组大小共同决定。(如int array[5]类型为int[5]) 2. 定义数组类型 (1)C语言中通过typedef为数组类型重命名: typedef type(name)[size]; ①数组类型:如typed
阅读全文
摘要:1. 数组的访问方式 (1)以下标的形式访问数组中的元素:如a[i]; (2)以指针的形式访问数组中的元素:如*(a+i) (3)下标形式 VS 指针形式 (1)指针形式以固定增量在数组中移动时,效率高于下标形式 (2)指针增量为1且硬件具有硬件增量模型时,效率更高 (3)下标形式与指针形式的转换:
阅读全文
摘要:1. 数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小: sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 【编程实验】a + 1的结果是什么? (答案是第2个元素的地址) 1 #include <stdio.h> 2 3
阅读全文
摘要:1. 数组的概念 (1)数组是相同类型的变量的有序集合 (2)数组在一片连续的内存空间中存储元素 (3)数组元素的个数可以显示或隐式指定 【编程实验】数组的初始化 1 #include <stdio.h> 2 3 4 5 int main(){ 6 7 8 9 //数组初始化 10 11 int a
阅读全文
摘要:1. 变量的回顾 程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段内存空间呢? 可以通过变量名访问存储空间 2. *号的意义 (1)在指针声明时,*号表示所声明的变量为指针 (2)在指针使用时,*号表示取指针所指向的内存空间中的值 ①*号类似一把钥匙,通过这把钥匙可以打开内
阅读全文
该文被密码保护。

浙公网安备 33010602011771号