c++有关的扩展知识
在头文件中进行变量,函数和类的声明,在其他文件是对类和函数进行实现。
- 头文件声明时要加上#ifndef #endif
- 对类方法进行实现要加上作用域解析运算符。
- 内联函数,直接在声明处定义,外面的话可以加上 incline。
- 使用 new 的内存便于节省内存空间,但是必须添加析构函数.
- 只要类方法不修改成员变量,就应该写为 const 方法。
//构造函数,析构函数
Stock(int a,int b);
~Stock();
//运算符重载
void operator*(const Stock)const;
//友元
friend void fun(Stock);
//输出重定向
ostream & operator<<(ostream &os,Stock);
c++学习途径:动态内存分配
1.动态内存分配
2.复制构造函数:有新对象生成
3.赋值构造函数:对象值的传递
4.静态成员
5.&运算符
在类有继承的代码写法中, 基类的析构函数应使用虚函数
//c++学习途径:继承
1.继承的三种方法:public,protected,private
2.类的多态
3.由多态引申出来的虚函数,
4.抽象继承与纯虚函数.
5.构造函数中的成员初始化列表和非构造函数中的
//类的多态
类的多态是指在基类和派生类中,可能存在同样一种方法,但是他们却有不同的实现方式,此时需要在基类和派生类中分别进行定义,这就是多态.
//虚函数
为了在使用指针是也能正确执行目的类的方法,出现了虚函数.
//抽象类及其纯虚函数
抽象类包含了纯虚函数,或者有纯虚函数成员的类,抽象类不能实例化.
第一层级(作用域::>..):() , [] , .(类) , ->(类) ; 第二层级(单目运算符):*指针,!非,~,; 第三层级(算术运算符>移位):*,/,+,-; 第四层级(比较>位运算符>逻辑运算符); 第五层级(赋值运算符>,表达式);
一般右侧的运算符优先级比左侧的高, 该方法常用语分析复杂函数声明, 类型声明上
从内向外分析: 先看右侧运算符, 再看左侧运算符
从外向内分析: 先看左侧运算符, 再看右侧运算符
const 和指针声明常量
int age=15;
const int *p= age; // 指针是常量
int * const p = age; // 值是常量
/*
语法错误会在声明定义的时候进行检测,如果声明时候成功了,后面就仅仅限量的局部的含义范围。
*/
// 多级指针时会出现符合语法的修改权限错误问题。
//定义:
double* fun(double a,double b);
double* (*p)(double a,double b);//其中p是一个指向fun函数的指针
double* (*p[3])(double a,double b);//p是一个大小为3的值fun函数指针的数组
double* (*(*p)[3])(double a,double b);//p是一个指向
命名空间限制了名字的使用范围,增加了约束。防止命名冲突问题。
用法:
- 作用域解析运算符 (::)
例: 标准库 iostream 的 cout 使用
std::cout << "Hello World!" << std::endl;
- 命名空间编译和声明
- 声明
using namespace std;
cout << "Hello World!" << endl;
asio::io_content io_content;
- 编译
namespace asio = boost::asio; // 空间
using tcp = asio::ip::tcp;
c++中 new 是申请动态内存的字,还有一个定位 new 运算符
new 做的事情: malloc 分配一块内存, 调用构造函数初始化数据
delete 做的事情: 先调用析构函数, 再 free 内存
new 申请的动态内动使用 delete 回收,定位 new 使用的内存不能使用 delete,报错(因为不是动态内存的地址)
// 申请单个地址
int *p1 = new int; => int *p1 = new(sizeof(int));
// 申请多个地址
int *p2 = new int[size]; => int *p2 = new(size*sizeof(int));
#赋值时加上{}
回收
#单个地址
delete p1
#数组
delete
// 定位new运算符
加上<new>头文件
申明时在new后面加上(地址指针)
如:
char buffer[20]
int *p = new (buffer) int[5];