int a = 10;
int *p = &a;
int &b = a;
*p = 20;
cout<<a <<" "<<*p<<" ”<< b<<endl; //20 20 20
b = 30;
cout<<a <<" "<<*p<<" ”<< b<<endl; //30 30 30
int &c = 20;//错误,底层汇编指令无法生成
引用和指针在底层汇编指令是一样的,通过引用变量修改所引用内存的值,和通过指针解引用修改指针指向的内存的值,其底层指令也是一样的。
int &&a = 20;
//专门用来引用右值类型,指令上,可以自动产生临时量 然后直接引用临时量 a = 30;
const int &b = 20;
//区别:a可以再赋值修改,b不可以
int &&c = a;
//一个右值引用变量本身是一个左值,只能用左值引用来引用它
//不能用一个右值引用变量来引用一个左值
函数重载:一组函数,其函数名相同,参数列表的个数或者类型不同,那么这一组函数可就称为函数重载。(前提函数一定处在同一作用域下) 返回值类型与函数是不是重载不会影响。
下面代码无论在C++编译器还是C编译器下都可以直接运行
#ifdef __cplusplus
extern "c"{
#endif
int sum(int a, int b)
{
return a+b;
}
#ifdef __cplusplus
}
#endif
new和malloc的区别是什么?
malloc和free称作C的库函数。 new和delete称作运算符
new不仅可以做内存开辟,还可以做内存初始化操作
malloc开辟内存失败,是通过返回值和nullptr做比较的 new开辟内存失败,是通过抛出bad_alloc类型的异常 来判断的
malloc按字节开辟内存的 new开辟内存时需要指定类型 所以malloc开辟内存返回的都是void * ,
malloc只负责·开辟内存空间,new不仅仅有malloc的功能还可以进行数据的初始化。(对于数组只能初始化为0)
delete (int*)p; //先调用析构函数,再进行free(p);
new == operator new delete =.= operator delete
C++为什么会区分单个元素和·数组的·内存分配和·释放 new delete new[] delete[]
对于普通编译器内置类型 new/delet[] new[]/delete 可以混用,但是不推荐 对于自定义类类型,有析构函数,为了调用正确的析构函数,那么开辟对象数组的时候会多开辟4个字节,用于记录对象的个数。 也正是这4个字节,在delete[] 时会自动把地址的起始位置-4,但是对于delete不会,它单单只会释放当前位置的内存,从而引发内存泄漏。所有报错异常终止。
抛出异常的new
int *p1 = new int(20);
不抛出异常的new
int *p2 = new (nothrow) int;
在堆上创建的常量new
const int *p3 = new const int(40);
定位new
int data = 10;
int *p4 = new (&data) int(50);
cout<<"data = "<< data << endl;//data =50