多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果
封装:封装的意义在于保护或者防止代码(数据)被我们无意中破坏。
继承:继承主要实现重用代码,节省开发时间
// 面向对象的五大基本原则
单一职责原则(SRP)
开放封闭原则(OCP)
里氏替换原则(LSP)
依赖倒置原则(DIP)
接口隔离原则(ISP)
C中:如果函数未指定返回值类型,则默认为int
c++中:如果一个函数没有返回值,返回值类型必须指定为void
C中:如果函数没有指定参数列表,则默认可以接受任意多个参数
C++中:有严格的类型检测,没有参数列表的函数默认为void,不接受任意参数
三、缺省参数(即给参数一个默认值)
C++:支持(如果没有指定实参则使用缺省值,有则使用指定实参)
1.默认实参必须在参数列表的结尾
2.默认参数只能出现在函数声明或者定义二选一中
3.缺省值必须是常量或全局变量
4.缺省参数必须是值传递或者常参传递
C++:支持在同一作用域中存在几个功能类似的同名函数,但参数列表(参数个数、类型、顺序)不同
引用:可以看做是一个变量的别名
2.一个变量可以有多个引用
3.引用一旦初始化,就不能在成为其他变量的引用
异:1.引用必须初始化
2.引用一旦绑定就不能更改
4.有多级指针,没有多级引用
// const修饰的对象为只读对象,只能调用const的成员函数,其成员变量不能直接被修改
// C++三目运算可以返回a或b的引用,可以当左值。但是其中有常量时,不能当左值
出错的原因是编译器根据字符串”hello
// 引用的实现是一个指针常量
// 内联函数省去函数调用时的压栈,跳转,和返回的开销,编译器会把该函数的代码副本放置在每个调用函数的地方
// inline只是一种请求,编译器你可以拒绝
? 1.在内联函数内不允许使用循环语句和开关语句;
? 2.内联函数的定义必须出现在内联函数第一次调用之前;
? 3.类结构中所在的类说明内部定义的函数是内联函数。
// 函数参数可以提供默认值
// 默认参数可以在定义时或者声明时指定,提供的参数在被调用时要被看见。
// static_cast:用于基本类型转换,不能用于基本类型的指针转换,用于继承关系对象的转换和类指针的转换
// const_cast:去除变量的只读属性,用于指针或引用
// dynamic_cast :用于继承关系的类指针转换,用于有交叉关系的类指针的转换,具
有类型检查功能,需要虚函数支持
11、类的成员 - 构造函数
// 构造函数的作用是对对象自动初始化
// 构造函数与类名相同,没有返回值,在对象定义时自动被调用
// 栈和堆上创建对象时,成员变量初始值为随机值
// 静态储存区和全局区上创建对象时,成员变量初始值为0
// 不能为虚函数,虚函数是为了对象的动态调用,对象都没构造,哪来的虚函数。
11、类的成员 - 初始化列表
必须在类初始化列表中初始化的几种情况:
// 2.通过显式调用父类构造函数,对父类数据成员初始化
11、类的成员 - 拷贝构造函数
C++中三种情况下需要调用拷贝构造函数:
// 没定义构造函数时,编译器自动提供无参构造函数和拷贝构造函数(有拷贝操作时)
// 自定义构造函数的话,两个构造函数必须同时指定
// 自定义构造函数,必然需要实现深拷贝
// 拷贝构造函数必须用引用传值,也就是传址,因为传址会造成再次调用构造函数,形成死循环
// 当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象
12、类的成员 - 析构函数
// 用来销毁对象,没有参数 没有返回值 被自动调用
// 析构顺序由于全局、静态变量先于局部变量构造,首先析构局部变量,而手动析构在 } 之前,在由于全局变量作用域大于静态变量,先于静态变量构造,所以最后析构
13、类的成员 - 临时对象
临时对象产生主要有以下三种情况:
// 值传递时会调用拷贝构造函数,并且创建临时对象;在多次继承情况下,临时对象的创建是一个很大的性能消耗,用引用传参可以避免
11、类的成员 – 虚函数和纯虚函数
// 虚函数可以被直接使用,也可以被子类重载后以多态形式调用
// 纯虚函数在子类中只有声明而没有定义,必须在子类中实现该函数,也可以在子类中重载,以多态形式被调用
14、类的成员 - 静态成员变量
// static成员变量是在类加载的时候生成
// 一般的成员变量是每个对象所自己拥有的,每次构造都会自己调用自己的成员变量
// 实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存
// static静态成员变量属于整个类所有,先于对象存在,可以类名::变量直接访问
不隶属于任何一个单独的对象
需要在类外单独分配空间
15、类的成员 - 静态成员函数
// 静态成员函数不可以直接访问成员变量
// 可以通过类名直接调用静态函数
// static静态成员变量属于整个类所有,先于对象存在,可以类名::变量直接访问
// 操作数函数也可以通过成员函数来完成
// 当全局函数和成员函数同时存在时 优先调用成员函数
// 二元运算符成员函数重载时, 只需要一个参数, 另一个参数由this(左操作数)指针传入
21、重载 - 赋值操作符的重载
// 当类的成员指代了外部资源,就需要重载赋值操作符来完成深拷贝
22、重载 - 数组操作符的重载
// 只能通过类的成员函数重载
// 重载函数能且仅能使用一个参数
// 可以定义不同参数的多个重载函数
// 指针的生命周期结束时主动释放堆空间
// 一片堆空间只能由一个指针标识
// 杜绝指针比较和指针运算
// 转换构造函数(有且仅有一个参数 参数是基本类型或者其他类型)
// 继承父类的成员函数中,调用的变量也来自父类,隐藏但不会覆盖,他们同时存在
28、继承 – 重定义(隐藏)
// 指在不同的作用域中,函数名相同,不能构成重写的都是重定义
// 子类的成员变量将隐藏父类中的同名成员变量
// 默认访问的是子类的成员,继承了但是不能直接访问,想访问父类用 ::分辨
// 子类的函数将隐藏父类的同名函数
// 由于再不同的作用域,子类不能重载父类的同名函数,用作用域分辨符::区分
c.add(1); // 编译不通过 子类同名函数隐藏父类,不存在重载
29、继承 – 赋值兼容
// 面向对象赋值兼容规则
1.子类对象可以赋值给父类对象
2.子类对象可以初始化父类对象
3.父类指针可以指向子类对象
4.父类引用可以引用子类对象
// 当父类指针(引用)指向子类对象时,子类对象退化成父类对象,只能访问父类中定义的成员
p = c; // 1.子类对象可以赋值给父类对象
30、继承 – 重写(覆盖 多态)
// 当在子类中定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写了父类这个虚函数。
// 根据实际指针指向的对象判断调用函数
// 子类重写父类函数,必须用virtual修饰,不然没有意义。因为默认调用父类函数
// 静态联编:在程序的编译期就能确定函数的具体调用 重载
// 动态联编:在程序的执行期才能确定函数的具体调用 重写
2、泛型编程 – 单例类模板
2、泛型编程 – 函数模板
// 函数模板是一种特殊的函数,可用不同类型进行调用, 类型可被参数化
// 编译器优先选用普通函数
// 可通过空模板实参列表限定值匹配模板
// 类的部分加上了约束条件,就是模板的特化
// 类模板的特化是把一个类模板根据不同的情况分开实现
2、泛型编程 – 数组类模板
// 模板参数也可以是数值参数
// 数值参数只能是常量,不能是变量,不能是double,不能是类
// Stack是一个容器类的改编,为程序员提供了堆栈的全部功能,实现了一个先进后出(FILO)的数据结构
按相关度排序 按时间排序
按相关度排序 按回复数排序
全部 文档 代码类 工具类
vc6.0有线程吗的相关搜索
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。