复习
C Plus (非官方定义的C Plus)
bool
在C语言中, bool(_Bool) 和 int 是转换关系
C语言中, bool类型的定义为:
(!0) == true
0 == false
在C++中, bool 是定义的类型!
const
const是C++先有的, 然后C标准又加进去的.
- 它可以将变量常量化
它是一个 编译器 的行为
- 在语法层面进行检测, 但凡有赋值操作, 就报错
- 可以使用const_cast去常量化
- 是有空间分配的
// 在空间分配方面
const int i = 100;
// 根据后续操作的不同, 有可能会直接变成100,
// 有可能是一个临时变量, 等等等等
// const 在编译的时候, 很多变化字面常量存储在常量区中, 属于非编译器级别的常量.
#define定义出来的一些宏 都属于 真常量
- const与宏的区别
- const 是一个具有类型的常量, 它可以在编译时进行
类型检查. - const在
编译时分配空间, 可以更加方便调试. - 作用域方面,
宏是全局的, const是有作用域的.
建议: 使用 const 代替 #define 的常量声明
本质上, const是给程序员看的, 它的所有便利都是给程序员带来的.
它能使 语义 更加清晰.enum
enum 可以来定义常量
- 它是
真常量,不是伪常量 - 不需要分配空间
域运算符
- 命名空间::类::静态类成员, 表示
作用域. - ::前边没有任何作用域, 表示
全局.
new和delete运算符
new 和 delete 是可以被重载的
malloc 和 new 的区别malloc不会调用构造函数
malloc是函数
函数重载
- 返回值类型的不同不能构成重载
- 参数类型不同, 参数个数不同, 可构成重载.
- const函数和非const函数可以构成重载.(仅针对于成员函数, const在函数尾部)
命名改编/命名粉碎
- 掌握了命名改编, 就掌握了函数的重载规则.
命名规则类似于:
[] 代表不一定有
[命名空间][@类名]@方法名[@参数1类型@参数2类型.....][@const]二义性
void Foo(int num) {}
void Foo(int num, int other = 10) {}
int main()
{
// 二义性产生了
// 对重载函数的调用不明确
Foo(20);
reutrn 0;
}void Foo(int num) {}
void Foo(unsigned int num) {}
void Foo(long num) {}
void Foo(double num) {}
int main()
{
// 二义性产生了
//从上往下的转换, 尝试匹配参数列表时....
long long llVal = 20;
Foo(llVal);
reutrn 0;
}void Foo(int num) {}
void Foo(float num) {}
int main()
{
// 二义性产生了
//从上往下的转换, 尝试匹配参数列表时....
Foo(1.00003);
reutrn 0;
}void Foo(char) {}
void Foo(short) {}
void Foo(double){}
int main()
{
// 二义性产生了
//从上往下的转换, 尝试匹配参数列表时....
Foo(1);
reutrn 0;
}解决二义性的方式:
指明调用类型
默认形参
- 给函数提供默认的参数值, 调用时可以不传.
- 必须在参数列表的最末尾
引用
- 引用一旦确定不可修改, 他是我们变量的别名
- 引用作为参数使用的时候, 传递的是本身
int& Foo(int& num)
{
num = 100;
return num;
}
int main()
{
int num = 1;
Foo(num);
// 此时, num == 100
Foo(num) = 10;
// 此时, num == 10;
return 0;类型转换
- 强制转换
是C风格的转换 - static_cast
- const_cast
inline函数
- inline只是发出请求, 会由编译器决定是否变成inline函数
- inline函数在编译时会被展开
Object
类与对象
- 类是抽象的
- 对象是实际存在的
类的访问权限
- 公有 public
- 私有 private
- 保护 protected
类的默认权限是 private 的
结构体
struct StructDemo
{
int num_;}
默认访问权限是 public 的.
- 与类相同拥有权限控制.
- 可以拥有成员函数.
类和结构体 区别在于 默认访问权限 不同.
他们都可以进行 抽象 和 封装.
C和C++
C语言有的, C++都有, 但是有区别.
- C 和 C++ 需要程序员来进行区别
- 在VS中, 使用 .c 和 .cpp 编译器来进行区别C和C++
类

- 默认构造函数是没有任何参数的
- 默认构造函数是一个空函数
- 构造函数是可以重载的
只有一个参数的构造函数会变成 转换构造函数
- 可使用 explicit 关键字禁止转换
- 默认拷贝构造函数默认不是空的
默认拷贝构造函数是浅拷贝的
- 在产生新对象并且对新对象进行对象间赋值的时候会被调用
- 进行参数中传递本类型参数的时候也会调用
- 默认赋值函数也是浅拷贝的
初始化列表
- 引用类型成员, const类型成员 必须通过初始化列表进行初始化.
一个空类默认生成的函数
- 默认构造函数
- 默认拷贝构造函数
- 默认析构函数
- 默认赋值函数
- 取址运算符(operator&)
- 取址运算符const (operator& const版本)
注意, 后两个函数只有在使用的时候编译器才会去定义它
疑问?????
不知道有没有默认的operator*的两个版本?运算符重载
- 单目运算符重载为成员函数
双目运算符重载为友元函数
- = () [] -> 无法重载为友元函数
- 类型转换运算符只能重载为成员函数
- 流运算符只能以友元方式重载
class Demo
{
public:
Demo(int num = 0):num_(num){}
void Open(){};
void Close(){};
private:
int num_;
}
// 智能指针类
class MyPoint
{
public:
MyPoint()
{
demo_ = new Demo;
}
~MyPoint()
{
delete demo_;
}
Demo* operator->()
{
return demo_;
}
void* operator new(size_t size)
{
// demo = malloc(size); // 先分配空间
// 在调用构造函数
}
void* operator new(size_t size, void* buffer)
{
// 不分配空间的new
}
private:
Demo* demo_;
}
int main()
{
MyPoint point;
// 直接访问
point->Open();
// int *p = new int(100);
char temp[100] = {0};
MyPoint* pPoint = new (temp) MyPoint(); // 此时分配的空间在temp里
return 0;
}如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-02-08 at 12:39 pm