【C ++】C++入门知识(二)

这篇具有很好参考价值的文章主要介绍了【C ++】C++入门知识(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++入门(二)

作者:小卢
专栏:《C++》
喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》

1.引用

1.1.引用的概念及应用

引用(&)

引用不是新定义一个变量,而是给已存在变量取了一个别名

它和它引用的变量共用同一块内存空间

类型& 引用变量名(对象名) = 引用实体;

引用在定义时,必须初始化

一个变量可以多次引用

1.2.传值返回和传址返回和传引用返回的底层原理:

int Cout()
{
	int n = 0;
	n++;
	return n;
}
int main()
{
	int ret = Cout();
	return 0;
}

n是如何传给ret的呢?

因为这里的n没有用static修饰,为临时变量,Cout函数调用时开辟了一段栈帧,n存在于这段栈帧内。但函数调用结束后,栈帧销毁。

n可以传过去是因为,函数栈帧结束前用了一个临时变量=n,然后用这个临时变量来作为返回值给ret。

这个临时变量应该内存比较小的时候,是用寄存器。

int Cout()
{
	static int n = 0;
	n++;
	return n;
}
int main()
{
	int ret = Cout();
	return 0;
}

这种情况下,n在静态区,这里n还是用一个临时变量来作为中间段,来进行返回值。

这种情况有优化的空间:

这种返回类型为传值返回。那如果用传引用返回呢?

这种就是利用一些变量出了作用域过后还存在的情况,例如:引用,malloc…

int& Cout()
{
	static int n = 0;
	n++;
	return n;
}
int main()
{
	int ret = Cout();
	return 0;
}

引用返回的好处:
1.减少拷贝
2.调用者可以修改返回对象

//引用返回
//1.减少拷贝
//2.调用者可以修改返回对象
#define N 10
typedef struct Array
{
	int a[N];
	int size;
}AY;
int& PostAt(AY& ay, int i)
{
	assert(i < N);
	return ay.a[i];
}
int main()
{
	//int ret = Cout();
	AY ay;
	for (int i = 0; i < N; i++)
	{
		PostAt(ay, i) = i * 10;
	}
	for (int i = 0; i < N; i++)
	{
		cout << PostAt(ay, i) << " ";
	}
	cout << endl;
	return 0;
}
int& Add(int a, int b)
{
	int c = a + b;
	return c;
}
int main()
{
	int& ret = Add(1, 2);
	Add(3, 4);
	cout << "Add(1, 2) is :" << ret << endl;
	//ret为随机值
	return 0;
}

这里ret为随机值,这里c返回的是一个别名,相当于返回的是一个c的别名,ret就是c的别名。

int main()
{
	int a = 1;
	int& b = a;
	//指针和引用,赋值/初始化,权限可以缩小,但不可以放大
	const int c = 2;
	int& d = c;
	return 0;
}

指针和引用,赋值/初始化,权限可以缩小,但不可以放大

1.3.指针和引用的区别:

从语法角度:引用是不开辟空间的,指针需要开辟空间

从底层角度:两种都是一样的

2.内联函数

2.1.宏的缺点:

1.不能调试

2.没有类型安全的检查

3.有些场景下非常复杂

#define ADD(x,y) ((x)*(y))//正确的宏函数
	//宏不是传参,而是替换
#define ADD(x,y) (x)*(y)///((a | b)* (a & b)),错误
#define ADD(x,y) (x*y)///(5+10*6+20),错误
#define ADD(x,y) x*y
//5+10*6+20=85,错误,替换可能会造成运算过程出错
int main()
{
	ADD(1, 2);
	//宏不是传参,而是替换
	int a = 1, b = 2;
	ADD(a| b, a & b); ///(a | b* a & b)
	return 0;

}

这里宏是替换而不是传值,它不会检查替换的值,像(a | b+ a & b)就会错误

使用宏函数,需要尽量加括号,很容易错。

2.2.内联函数

inline int Add(int x, int y)
{
	int z = x + y;
	return z;
}
int main()
{
	int ret = Add(1, 2);
	cout << ret << endl;
	return 0;
}

【C ++】C++入门知识(二),C++,c++,c语言,算法

release中没有call Add,减少了函数调用时栈帧的开辟

效率提高,并且可以调试,很好的替代了宏

inline内联函数是一种以空间换时间的情况,这里的空间指的是编译的指令,不是内存

// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
f(10);
return 0;
}

这里会出现链接错误:
【C ++】C++入门知识(二),C++,c++,c语言,算法

内联函数不建议定义和实现分离!

当定义和实现分别在.c文件和.h文件中时:程序运行时,当程序运行时,main函数编译到f(10)的地方,会优先编译函数定义并不会链接,而在链接过程中,通过头文件找到函数调用

当f为内联函数时,内联函数是在编译过程完成编译的,因此系统就会认为f()是一个内联函数,所以不会将其链接,所以就会出现链接错误。

3.auto关键字

#include <iostream>
using namespace std;
int main()
{
	int a = 0;
	auto b = a;
	auto c = &a;
	//typeid(变量名).name()可以获取变量的实际类型
	cout << typeid(b).name() << endl;//int
	cout << typeid(c).name() << endl;//int*
	return 0;
}

3.1auto的好处

std::map<std::string, std::string>dict;
	std::map<std::string, std::string>dit=dict;
	//上一行和下一行是一样的,这就是auto的实际好处
	auto dit = dict.begin();

3.2typedef的缺点:

typedef char* pstring;
int main()
{
	const pstring p1;//编译是否成功
	const pstring* p2;//编译是否成功
	//p1失败,p2成功
	return 0;
}

p1:实际上使用typedef后,const pstring p1会变成char* const p1

这里const修饰的是p1,而这样的p1只有一次初始化的机会,因此必须初始化。

4.范围for

自动依次取数组中数据赋值给e对象,自动判断结束

for循环后的括号由冒号“ :”分为两部分:

第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

int array[] = { 1,2,3,4,5,6,6,4 };
	for (int i = 0; i < sizeof(array) / sizeof(int); i++)
	{
		cout << array[i] << " ";
	}
	cout << endl;
	//范围for --语法糖
	for (auto e : array)
	{
		cout << e << " ";
	}//两种结果一样
	cout << endl;

5.nullptr

void f(int)
{
	cout << "f(int)" << endl;
}
void f(int*)
{
	cout << "f(int*)" << endl;
}//这里函数重载,但结果都是f(int)
//C++中,NULL被定义为0,这也不知道为什么是个错误不太好
int main()
{
	f(0);
	f(NULL);
	return 0;
}

因此,C++11中打了一个补丁,用nullptr来代替NULL。

注意:文章来源地址https://www.toymoban.com/news/detail-787506.html

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

到了这里,关于【C ++】C++入门知识(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 进制转化入门知识(1)

    进制是一种用来表示数值的系统或方法,它是基于一个特定的基数来工作的。在我们常见的几种进制中,有: 1. **二进制(基数 2)**:    二进制只用两个数字:0和1。这是计算机内部使用的数制系统,因为计算机的基本单元(比特)只有两种状态:0或1。 2. **十进制(基数

    2024年02月09日
    浏览(29)
  • 【C ++】C++入门知识(二)

    作者:小卢 专栏:《C++》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 1.1.引用的概念及应用 引用() 引用不是新定义一个变量,而是给已存在变量取了一个别名 它和它引用的变量共用同一块内存空间 类型 引用变量名(对象名) = 引用实体; 引用在

    2024年02月02日
    浏览(28)
  • 【C++】C++入门必备知识详细讲解

    首先我们先要知道,C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库。本章将会带大家了解,C++是补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。 在C/C++中,变量、函数等等都是大量存在的,这些变量、函数和类的名称

    2024年02月16日
    浏览(38)
  • 【C++】入门基础知识详解(二)

    目录 一、内联函数 1、概念 2、特性 3、内联函数与宏的优缺点 二、auto(C++11)   1、auto 简介   2、auto的使用细则     2.1 auto与指针和引用结合起来使用     2.2 在同一行定义多个变量   3、auto不能推导的场景     3.1 auto 不能作为函数的参数     3.2 auto 不能直接用来声

    2024年02月11日
    浏览(26)
  • 【C++】入门基础知识详解(一)

    目录 一、C++ 二、命名空间   1、命名空间的定义   2、命名空间的使用 三、C++输入输出 四、缺省参数   1、缺省参数的概念   2、缺省参数的分类     2.1 全缺省参数     2.2 半缺省参数 我们在学习C++之前,我相信大家大多数都对C语言多多少少都有所了解,C语言的关键

    2024年02月12日
    浏览(43)
  • 【C++】入门C++前需要了解的小知识

    个人主页 : zxctsclrjjjcph 文章封面来自:艺术家–贤海林 如有转载请先通知 今天开始准备步入C++的大门,那么学习之前得先了解一下它的发展历史,和知道学好这门课程的重要性。 C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序

    2024年01月21日
    浏览(70)
  • C语言 —— 初步入门知识(内存、指针、结构体)

    本篇文章将接着上篇继续介绍C语言的基础知识,那么对于C语言大部分初学者会觉得难以理解, 所以作者将指针单独拿出来写篇较短的文章进行讲解。 要学习指针,就先要了解内存。一起来看。 内存是计算机中的关键组成部分,用于存储数据和程序。 每个内存单元的大小通

    2024年02月07日
    浏览(28)
  • C语言入门基础知识【完整版】

    C语言中二进制数、八进制数和十六进制数的表示: 二进制 :二进制由 0 和 1 两个数字组成,使用时必须以0b或0B(不区分大小写)开头。例如: 0b101 、 0B001 注意:标准的C语言并不支持二进制写法,有些编译器自己进行了扩展,才会支持二进制数字 八进制 :八进制由 0~7 八个

    2024年02月09日
    浏览(73)
  • 遗传算法(GA)入门知识梳理(超详细)

    目录 一、遗传算法的生物背景 二、遗传算法(GA)思想 2.1遗传算法的组成 2.2编码 2.3适应度函数 2.4遗传算子 2.4 运行参数 三、基本遗传算法(SGA)伪代码 3.1算法流程图 3.2 算法伪代码 四、遗传算法的优化、应用前景 4.2 遗传算法的优化 4.3 遗传算法的应用 五、遗传算法实例分析

    2024年02月06日
    浏览(30)
  • 单片机----汇编语言入门知识点

    目录 汇编语句的格式 汇编语句的两个基本语句 子程序的调用 查表程序设计 1.x和y均为单字节数的查表程序设计 2.x为单字节数y为双字节数的查表程序设计 3.x和y均为双字节数的查表程序设计 分支转移程序设计 1.单分支选择结构 2.多分支选择结构 循环程序设计 (1) 计数循环控

    2024年04月28日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包