C++入门2

一.引用

引用,就是为变量取了另一个名字(别名),一般用地址符&表示。在这种情况下,别名和原名看作是同一个变量,而且他们是占用同一块内存,格式如下:

int main()
{
	int value = 10;//定义引用必须要初始化
	int& refval = value;
	return 0;
}

在这里&就不再是求地址运算符,而是作为引用的标识作用。

另一种用法。通过引用改变外界值

void func(int& ta, int& tb)
{
	ta = 13;
	tb = 14;
}
int main()
{
	int a = 3;
	int b = 4;
	cout << a << endl;
	cout << b << endl;
	func(a, b);
	cout << a << endl;
	cout << b << endl;
	return 0;
}

二.常量

不变的量就是常量,关键字const,不变的意思;

编辑

添加图片注释,不超过 140 字(可选)

无法改变,编译器会报错;

实际上,也有一些方法可以改变,但是不建议,如下:(刚开始学习,能不改就不改,会有很多错误)

	const int var = 7;//保证这个定义值,不会被改变(有了名字的变量)
	int& var2 = (int&)var;//强制引用
	var2 = 18;

.另一个constexper,也是常量关键字,在编译的时候求值,可以提升性能。

constexpr int var = 3;
	int &var2 = (int &)var;
	var2 = 7;
	cout << var << endl;
	cout << var2<< endl;

.这样可以改,但是不建议。

三.范围for语句

主要用于遍历一个序列;


	int v[]{ 1,2,3,45,555,66 };
	for (auto &x : v)//x作为变量依次遍历数组v中的数据
	{
		cout << x << endl;
	}

这里用x引用代表v,可以节省内存空间,提升效率;

四.动态的内存分配问题

在C中,供程序使用的存储空间,有程序区,静态存储区和动态存储区

在C++中,我们把内存分为五个部分:

1.栈,主要用来存放函数内的局部变量,例如:

void func()
{
	int abc;
}

其中abc,就是函数内的局部变量,这一部分有编译器自动分配和释放。

2.堆,由程序员决定释放,其中有malloc/new存储,由free/delete释放。

3.全局/静态存储区:全局变量和静态变量放这里,程序结束由系统释放;

4.常量存储区;

5.程序代码区;

栈和堆的区别:

栈,系统分配用于存放局部变量,好处是分配速度快,但是空间有限,程序员控制不了;

堆,理论上物理硬盘有多大,就可以有多大的内存,好处是灵活,可以程序员手动分配,手动释放,缺点肯定比栈的分配速度慢;用new分配,delete删除。

new和delete在C++中,是标识符而不是运算符,使用格式如下:

第一种:指针变量名=new 类型标识符

	int* myint = new int;
	if (myint != NULL)
	{
		*myint = 8;//指针指向的变量
		cout << *myint << endl;
		delete(myint);//释放空间
	}

第二种:指针类型名=new 类型标识符(初始值)

int* myint = new int(18);
	if (myint != NULL)
	{
		//*myint = 8;//指针指向的变量
		cout << *myint << endl;
		delete(myint);//释放空间
	}

第三种:指针类型名=new 类型标识符[]//分配一个数组

int* pa = new int[100];//开辟了一个大小为100的数组
	if (pa != NULL)
	{
		int* q = pa;
		*q++ = 12;//第一个元素
		*q++ = 18;//第二个元素
		cout <<*pa << endl;//12
		cout << *(pa+1)<< endl;//18
		delete [] pa;//释放空间
	}

.在这里中括号必须配对使用。

五.nullptr

代表空指针,等价于NULL。引入nullptr主要是为了避免NULL和整形0的混肴,在使用跟指针有关的场合中,能用nullptr,就全部使用nullptr,而不使用NULL.

六。函数回顾和后置返回类型

把函数返回类型放到函数名字之前,叫做前置返回类型;

//函数声明时,只有形参类型,没有形参名
void func123(int , int);//函数声明加分号
void func123(int a,int)//这里后者可以不给名字
{
	return;
}
int main()
{
	func123(12, 13);//但是在这里调用的时候,还是需要给值
	return 0;
}

在C++11中,引入另一种后置返回类型,就是在函数声明和函数定义中,返回类型在参数列表之后

auto func(int a, int b) -> void;//函数声明
auto func(int a, int b) -> void//函数定义
{

}

七.内联函数

inline int myfunc(int testv)//在函数定义前加inline就变成了内联函数
{
	return 1;
}

.内联函数主要解决一个问题,对于一个被频繁调用的函数,并且函数本身很小,因为频繁调用函数会消耗资源,因此我们引入内联函数的概念;

主要方法是,在编译阶段,编译器通过把调用函数的操作替代为函数本身。

而且内联函数定义都要放在头文件中

//#define 宏展开

八.函数杂合用法总结

第一种:void表示函数不返回任何类型,但是可以使用一种函数调用,把void作为一个返回值。

void funca()
{

}
void funcb()
{
	return funca();
}

第二种:在C++中函数允许同名,但是形参列表必须有明显的区别

九.const char *,char const*p,char * const p三者的区别

第一种,const在前,const chat*p

char str[] = "I LOVE CHINA";
	const char* p;//p指向的东西不能通过p来修改,但是可以通过其他手段来修改
	p = str;
	//*p = "Y";
	p++;
	p++;
	str[0] = 'Y';

第二种,const在中间,char const *p

等价于const char * p;

char str[] = "I LOVE CHINA";
	char const * p;//p指向的东西不能通过p来修改,但是可以通过其他手段来修改
	p = str;
	//*p = "Y";
	p++;
	p++;
	str[0] = 'Y';
	return 0;

第三种const在最后,char * const p

char str[] = "I LOVE YOU";
	char* const p = str;//表示指向只能指向p,但是指向的内容可以更改
	*p = 'y';

其他的用法

int i = 100;
	const int& a = i;//表示i的内容,无法通过a 来修改

.

const int& b = 31;//b和31绑定,无法修改
	cout << b << endl;

十.函数形参中带const

struct student
{
	int num;
};
void fs(const student& stu)//一定要学习这种方法,在形参中加入cosnt,这样可以避免其中内容被修改
{
	//stu.num = 1010;
}
int main()
{
	student abc;
	abc.num = 100;
	fs(abc);
	cout << abc.num << endl;

这些写得好处:

首先,可以防止我们在无意间改变形参内容,导致实参在无意中修改;

其次,最大的好处的可以让实参更加的灵活。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值