C++ 一些容易忽略的基本点
new 高级应用
delete 其他用途帮助函数严格匹配类型
char teststr[100] = { 0 };// 静态区
void test3()
{
// 堆区
int *p = new int[3]{1, 2, 3};
//分配到以teststr开头的空间内 全局静态区
int *p2 = new (teststr) int[3]{1,2,3};
for (int i = 0; i < 3; i++)
{
cout << p[i] <<" "<< &p[i] << " " << p2[i]<<" " << &p2[i] << endl;
}
// 这段内存可以反复利用 同理 栈区 都可以
// 无论堆栈静态区 都不能delete p2
int *p2_ = new (teststr) int[3]{4, 5, 6};
静态区对象优先main执行
基本数据类型malloc new一样
malloc free不会调用构造析构函数 不能混用
通过重载new 和delete 可以统计对象个数
规避一个指针被重复释放
函数模本和类模板 2这区别 函数模板使用不需要置顶类型 因为编译器会自动帮你做 类模板则不会
函数模板调用的时候才编译 否则不会进行语法检查
函数模板 返回两个值中的较小者 同时能正确处理字符串
可以重载string类的>运算符 相比c里面的宏 的确很灵活
C++ 新语法 自动推导数据类型
C++类 析构函数 为虚函数 多态
友元函数能访问私有数据成员
类型一致 的初始化可用initializer_list
如果是不一致的 可变参数模板
结构体具备类的所有功能
设置一个不允许回收不允许在堆上创建
重载delete new = delete删除函数
默认继承 struct公有 而class私有
有了初始值就不能私用大括号初始化
但是数组成员不能有初始值 而且只能用=来初始值
例如 字符数组不可以 字符指针可以
拓展作用域 类的声明
非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);唯一的例外是对于mutable修饰的成员。加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用
一般对于不需修改操作的成员函数尽量声明为const成员函数,以防止产生const对象无法调用该成员函数的问题,同时保持逻辑的清晰