C++
C和C++的区别
关键字(keyword)的数量不同
-
c++的关键字
-
delete
- 作用:“=delete”指示编译器不生成默认复制构造函数 如:Point(const point &p)=delete;
-
default
- 作用:指示编译器提供默认构造函数。如:Clock()=default;
-
nullptr
-
作用
-
表达更加准确类型安全的空指针。
-
C++的函数重载机制
- 结果为D(null)不报错,null相当于为0,如果采用C机制无法函数重载会报错 - 结果为void
-
-
由来:C/C++的NULL宏是个被有很多潜在BUG的宏。因为有的库把其定义成整数0,有的定义成 (void*)0(空字符)。在C的时代还好。但是在C++的时代,这就会引发一下问题
-
与null的区别
-
NULL在C++中的定义
- /* Define NULL pointer value /
#ifndef NULL//如果没有自定义NULL
#ifdef __cplusplus
#define NULL 0 //null=0
#else / __cplusplus */
#define NULL ((void )0)//与C相同
#endif / __cplusplus /
#endif / NULL */ - 明确定义为整数0
- 作用:方便函数重载
- /* Define NULL pointer value /
-
NULL在C中的定义
-
#define NULL ((void *)0)//
-
void表示“无类型”,void *表示无类型指针。在定义指针的时候,必须声明指针的类型,因为类型决定了指针移动的字节数。移动字节数为0
-
C_中NULL与空字符串的区别
- 空字符串是 “”,会创建一个对象,内容是"",有内存空间;
而NULL,不会创建对象,没有内存空间;
举个比喻:
“” 相当于我的钱包里没有钱;
NULL 相当于我没有钱包;
- 空字符串是 “”,会创建一个对象,内容是"",有内存空间;
-
-
-
-
mutable(译:可变的)
- 跟constant(既C++中的const)是反义词。
在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
- 跟constant(既C++中的const)是反义词。
-
-
c的关键字
-
总结:C++中的有些关键字C中没有,可以在C中作为函数和变量的标识符:例如new,delete
-
标准输入输出流
C++函数原型中可以声明一个或者多个带有默认值的参数(从右向左连续)
- 子主题 1
C++支持函数重载(底层命名规范不同),C不支持
C++面向的东西不同
-
C++面向对象
- 封装,继承,多态三大特性
-
C面向过程
- C性能比C++高:原因:类调用需要实例化,开销较大,但是C不易维护,复用。
C和C++相同之处
编译预处理
-
宏定义
-
#define
-
定义符号常量
- 很多情况下已被const定义语句取代
-
定义参数宏
- 已被内联函数取代
-
defined 与#if, #elif配合使用,判断某个宏是否被定义
-
-
#undef
- 删除由define定义的宏
-
-
文件包含
- #include
-
条件编译
- #if 编译预处理中的条件命令,相当于C语法中的if语句
- #ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
- #ifndef 与#ifdef相反,判断某个宏是否未被定义
- #elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
- #else 与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
- #endif #if, #ifdef, #ifndef这些条件命令的结束标志.
封装
作用域
-
函数原型作用域
- 例如:(double area(double radius)😉
-
局部作用域(块作用域)
-
类作用域
-
文件作用域
-
命名空间作用域
-
匿名命名空间
- 作用:空间中定义的变量和函数不能在别的文件中使用。
-
访问限定符
- public:public成员可在类外直接访问
- protected;类外不可直接访问,派生类可以访问(在基础部分才有用)
- private;类外不可以直接访问
共享数据的保护
-
const
-
const修饰成员函数
-
用法:在成员函数后面加const,
-
例子:void fun()const编译器处理为void fun(const T*this)
-
作用:const修饰了this指针所指的对象,保证了这个const成员函数的对象在函数内部不会改变
-
好处
- 1如果在编写const成员函数时,不慎修改了数据成员,2,调用了其他非const成员函数,编译器将报错,
- 这大大提高了程序的健壮性。
-
运用场景
- 任何不会修改数据成员的函数都因该声明为const类型。
-
-
const修饰成员数据
-
const修饰类
- 作用:对象的数据成员不能被修改
- 对象必须在定义的同时进行初始化。
- 常对象只能调用const型的成员函数,不能调用非const型的成员函数,同时可以通过普通对象去调用const函数。
- 虽然常对象中的数据成员不能被修改,但是如果想要修改可以通过修改数据成员声明为mutable。
-
const修饰引用
- 常引用:被引用的对象不能被更新。
-
const修饰数组
- 常数组:数组元素不能被更新
-
const修饰指针
-
-
友元
-
友元类
- 单向的
- 若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员和保护成员。
- 类与类之间共享数据
-
好处
- 在实现类之间数据共享时,减少系统开销,提高效率。
-
作用
- 使得两个类共享同一个数据或函数(无论私有共有)
-
友元函数
-
用法;在函数前加friend
- 子主题 1
-
注意:
-
友元函数不是类的成员函数
-
友元函数允许在类外访问该类中的任何成员(但是友元函数不能运用this指针
-
方法
-
要访问非static成员时,需要对象做参数;
- class INTEGER
-
-
-
-
-
{
friend void Print(const INTEGER& obj);//声明友元函数
};
- 要访问static成员或全局变量时,则不需要对象做参数;
- 如果做参数的对象是全局对象,则不需要对象做参数;
- 友元函数一定程度上破坏了封装性
- 如何判断友元函数释放需要参数
- 类与函数共享数据
- 坏处
- 友元函数破环了封装机制,尽量使用成员函数,除非不得已的情况下才使用友元函数。
- 与成员函数对比
- 友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。
- 成员函数有this指针,而友元函数没有this指针。
-
inline内联函数
-
特点
- inline对于编译器只是一个建议,编译器会自动选择是否设置当前为内联函数
- 在编译期间编译器会将内联函数调用地方进行展开,没有函数压栈的开销
- 定义在类内部的成员函数默认定义为内联函数
- 在debug版本中没有真正的内联,可以进行调试;release版本下才会真正实现内联。
-
以下情况不适合内联
- 函数体内代码较长,会导致代码膨胀过大
- 如果函数体内出现循环或者其他复杂控制结构,那么自信函数体内的代码的时间将比函数调用开销大的多,次数内联意义不大。
-
-
类的静态成员(static)
-
静态数据成员
-
定义:在类中只能声明可是不能定义哈!
要对静态数据成员定义和初始化必须在类的外面也就是在全局作用域中定义,如果定义不给出初值,则默认初值为0- 结果为0!
- 结果为1
- 结果会报错,原因没有在全局变量中进行初始化!
-
-
静态函数成员
-
-
// An highlighted block
var foo = ‘bar’;
- 子主题 1
多态
子主题 1
继承
子主题 1
-
继承的本质: 数据的复制 ,编译器帮我们做了很多操作
-
子主题 1!
- 这个时候我们打印出来的 Sub的大小是1
因为它没有任何数据
- 这个时候我们打印出来的 Sub的大小是1
-
子主题
- 这个时候我们可以看到结果变成了16
为什么是 16呢 因为Base 与 Sub各自有两个int类型的成员变量 int 类型占用4个字节 所以Sub自己有两个int类型的变量 然后又继承了 Base的 所以这个时候的Sub大小就是 以Base为起始+Sub的大小所以就是16个字节
- 这个时候我们可以看到结果变成了16
-
XMind: ZEN - Trial Version