文章目录
一、 什么是内存对齐?
编译器为每个“数据单元”按排在某个合适的位置上。
性能原因:对齐的情况下,CPU只需要一个主线周期将数据读到内存中。对齐的情况下,计算机性能会更好。
#include<iostream>//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<iostream>
using namespace std;
int var = 100;
int main(void)
{
int var = 50;
cout << var << endl;
cout << ::var << endl;
return 0;
}
三、new 、delete运算符
1.new
三种用法:
1.new operator 分配内存+调用构造函数
operator new 分配内存
placement new 不分配内存、调用拷贝构造函数
2.delete
释放一个对象
1.调用析构函数
2.释放内存(operator delete)
四、重载
1.相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载overload
2.函数重载又称函数的多态性(静态的多态,编译时确定函数的local地址,静态联编)
3.函数重载的不同形式:
形参数量不同
形参类型不同
形参的顺序不同
形参数量和形参类型都不同
举例如下:
#include <iostream>
using 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);//不合法
#include <iostream>
using 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对象的引用
#include <iostream>
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;
}
3.按引用传递
1.引用传递方式是在函数定义时在形参面前加上引用运算符“&”
2.按值传递方式容易理解,但是形参值的改变不能对实参产生影响。
⭐参数传递类型:值传递(形参不能更改实参),指针传递
3.举例
#include <iostream>
using 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++推荐使用引用,不得已时使用指针。因为,值传递实参要初始化形参,将实参内容拷贝到形参;引用传递中,实参初始化形参不分配空间;指针传递,本质是传递,如果要修改指针的地址,单纯指针传递是不行的。