C++基础内容学习

目录

 

一、程序内存分区

一、代码区

二、全局区

三、栈区

四、堆区

二、引用

三、函数

一、函数默认参数

二、函数重载


一、程序内存分区

代码区和全局区均为未生成exe可执行程序前就存在的

一、代码区

1.存放cpu执行的机器指令

2.代码区共享,无论生成多少个exe文件,都使用同一个代码

3.代码区只读,防止程序生成时被修改。

二、全局区

1.存放全局变量和静态变量

2.全局区包含常量区,各种常量存放在此,注意是全局的

3.该区域数据将在程序结束后由系统自动释放

三、栈区

编译器自动分配,系统自动释放、即为平时所设变量

四、堆区

由程序员分配释放,否则由操作系统回收。

c++使用new再堆区开辟内存,delete释放

下面这段代码展示了内存分布上的不同

#include<iostream>
using namespace std;
int a, b, c;
const int i = 1, j = 2;
static int k = 3, l = 4;
int main()
{
	int d, e, f;
	const int g = 1, h = 2;
	cout << "全局变量地址:\n" << &a << endl
	    << &b << endl
		<< &c << endl;
	cout << "全局const修饰常量地址:\n" << &i << endl
		<< &j << endl;
	cout << "static静态变量地址:\n" << &k <<
		endl << &l << endl;
	cout << "局部变量地址:\n" << &d << endl
		<< &e << endl
		<< &f << endl;
	cout << "局部const修饰常量地址:\n" << &g <<
		endl << &h << endl;
	return 0;
}

二、引用

 int&b=a,b为a的引用,相当于给a起个别名,二者指向同一块内存空间

引用必须初始化,且初始化完成后不可更改。

引用可做函数参数及返回值类型

引用必须对一块合法的内存空间

#include<iostream>
using namespace std;
void swap(int&a, int &b)//引用交换
{
	int ret = a;
	a = b;
	b = ret;
}
int&test()
{
	int a = 100;
	return a;
}
int main()
{
	int a = 10, b = 20, c = 30;
	int &d = a;
	cout << "d=" << d << endl;
	a = 11;
	cout << "d=" << d << endl;
	d = 12;
	cout << "a=" << a << endl;

	cout << "b=" << b << endl << "c=" << c << endl;
	swap(b, c);
	cout << "b=" << b << endl << "c=" << c << endl;

	int&f = test();//不同编译器结果不同,VS2017,两个都为随机值,同步a被销毁
	cout << "f=" << f << endl;//DEV 第一个为100,第二个为0。
	cout << "f=" << f << endl;
}

 

引用的本质是一个指针常量int*b=a会自动转化为int* const b=&a,使用时会自动解引用,其指针指向不可修改,但其所指内存空间的值可被修改。

那么 const int*b=&a,则为指针指向可改,但其所指内存的值不可更改。

常量引用 const int* const b=&a,则为二者均不可更改 ,可防止值被修改

三、函数

一、函数默认参数

#include<iostream>
using namespace std;
void fun1(int a = 1, int b = 2, int c = 3)
{
	cout << a + b + c << endl;
}
void fun2(int a,int)
{
	cout << "this is a function a=" << a << endl;
}
void fun3(int a, int b);
void fun4(int a=10, int b=10);
int main()
{
	fun1();
	fun1(10);
	fun1(10, 20);
	fun2(999,1);
	fun3(1,2);
	fun4();
	return 0;
}
void fun3(int a = 10,int b = 10)
{
	cout << a + b << endl;
}
void fun4(int a, int b)
{
	cout << a + b << endl;
}

注意:函数默认参数设置从左到右依次设值 像fun(int a=1,int b,int c=30),就是错误的。

传参也是从左到右赋值。

无变量名的参数为占位参数,传值才能调用

在设置默认参数时,声明与定义只能有一处。且在定义处声明时,函数仍参照声明,要求输入参数。

二、函数重载

函数重载必须满足以下条件:

在同一作用域下

函数名相同

函数参数类型不同或个数不同或顺序不同

注:函数返回值类型不可作为函数重载的条件

#include<iostream>
using namespace std;
void fun(int a,double b=10)
{
	cout << "fun(int a,double b=10)" << endl;
}void fun(double a, int b=10)
{
	cout << "fun(double a, int b=10)" << endl;
}


void fun(char&a)
{
	cout << "fun(char&a)" << endl;
}
void fun(const char&a)
{
	cout << "fun(const char&a)" << endl;
}

int main()
{
	fun(1);
	fun(1.1);
	fun(1, 2.0);
	fun(3.14, 1);
	char a = 'c';
	fun('c');
	fun(a);
	return 0;
}

 

引用也可作为函数重载条件,同时要注意默认参数对函数重载的影响

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

...404 Not Found

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值