2021-10-13


一、 什么是内存对齐?

编译器为每个“数据单元”按排在某个合适的位置上。
性能原因:对齐的情况下,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++推荐使用引用,不得已时使用指针。因为,值传递实参要初始化形参,将实参内容拷贝到形参;引用传递中,实参初始化形参不分配空间;指针传递,本质是传递,如果要修改指针的地址,单纯指针传递是不行的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值