- 一、 什么是内存对齐?
- 二、域运算符
- 三、new 、delete运算符
- 1.new
- 2.delete
- 四、重载
- 五、name managling&extern"C"
- 六、带默认形参值的函数
- 七、引用
- 1.引用
- 2.const引用
- 3.按引用传递
一、 什么是内存对齐?
编译器为每个“数据单元”按排在某个合适的位置上。 性能原因:对齐的情况下,CPU只需要一个主线周期将数据读到内存中。对齐的情况下,计算机性能会更好。
#include//for cout using namespace std; struct test { char a;//第一个结构体单元存储在偏移量为0的地址上 //其他成员对齐到某个数的整数倍 double b; }; int main(void) { cout << sizeof(test) << endl; return 0; }
对齐数取编译器预设的一个对齐整数与该成员大小的较小值,默认值为8,可以在属性页进行修改。结构体总大小应扩充到最大对齐数的整数倍。
#pragma pack(4)//可以修改最大对齐数二、域运算符
#include三、new 、delete运算符 1.newusing namespace std; int var = 100; int main(void) { int var = 50; cout << var << endl; cout << ::var << endl; return 0; }
三种用法: 1.new operator 分配内存+调用构造函数 operator new 分配内存 placement new 不分配内存、调用拷贝构造函数2.delete
释放一个对象 1.调用析构函数 2.释放内存(operator delete)四、重载
1.相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载overload
2.函数重载又称函数的多态性(静态的多态,编译时确定函数的local地址,静态联编)
3.函数重载的不同形式:
形参数量不同
形参类型不同
形参的顺序不同
形参数量和形参类型都不同
举例如下:
#includeusing namespace std; void fun(int a, int b) { cout << "int fun" << endl; } void fun(double a, double b) { cout << "double fun " << endl; } int main(void) { fun(3, 4); fun(3.3, 3.4); return 0; }
合法重载
五、name managling&extern"C"1.name managling 这里翻译为名字改编,C++为了支持重载引入的。如上例子中的fun函数重载,对于计算机而言函数名进行了改编是不相同的。 2.extern C实现C语言与C++语言的混合编程。 3.⭐ #ifdef _cpluscplus
extern "C" void fun(int a , int b)//按C语言的方式进行编译,所以不会进行名字改编会报错六、带默认形参值的函数
1.函数没有声明时,在函数定义中指定形参的默认值 2.函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值 3.默认值的定义必须遵循从右到左的顺序,即如果某个形参没有默认值,则它左边的参数就不能有默认值。 void func1(int a=1,double b,int c=3);//不合法
#includeusing namespace std; int fun(int a, int b=5) { return a + b; } int main(void) { cout << fun(3) << endl;; return 0; }//打印出结果8
重载函数中如果形参带有默认值时,可能产生二义性,编译器不能确定调用哪个函数。
七、引用 1.引用给变量起别名,没有自己独立的地址空间,引用需要与自己引用的地址空间共享空间。对引用所做的改变实际上是对它所引用的变量进行改变。
int main(void)
{
int val = 100;
//引用在定义的时候必须初始化
//引用一经初始化,不能重新指向其它变量
int& refval = val;
refval = 200;//实际上改变的是val这个变量
int val2 = 500;
refval = val2;//不代表将refval引用至val这个变量,仅仅只代表将val2赋值给refval
return 0;
}
2.const引用
指向const对象的引用
#include3.按引用传递using namespace std; //const引用是指向const对象的引用 int main(void) { const int val = 1024; const int& refval = val; int& ref2 = val;//Error常量无法转换成引用 int val2 = 1024; const int& ref3 = val2; ref3 = 300;//不能给常量赋值 return 0; }
1.引用传递方式是在函数定义时在形参面前加上引用运算符“&” 2.按值传递方式容易理解,但是形参值的改变不能对实参产生影响。 ⭐参数传递类型:值传递(形参不能更改实参),指针传递 3.举例
#includeusing namespace std; void swap(int& x, int& y) { int temp = x; x = y; y = temp; } int main(void) { int a = 5; int b = 6; swap(a, b);//函数调用时,引用被初始化x=a,y=b cout << "a=" << a << "b=" << b << endl; return 0; }
⭐⭐注: 引用的另一个作用是用于返回引用的函数。 不能返回对**局部变量**的引用,局部变量在函数返回时已经销毁了,是无效返回。 C++推荐使用引用,不得已时使用指针。因为,值传递实参要初始化形参,将实参内容拷贝到形参;引用传递中,实参初始化形参不分配空间;指针传递,本质是传递,如果要修改指针的地址,单纯指针传递是不行的。



