C++入门概念

在这里插入图片描述

1. 命名空间

  C++命名空间的作用主要是为了防止开发过程中,开发人员之间的变量或者函数的名称定义冲突。当然有时候也可能是为了防止与C++标准库命名空间产生冲突,例:std标准库的命名空间中的rand

1.1命名冲突

std命名空间中的rand和全局域中的命名冲突了

1.2 解决命名冲突 —— 命名空间·

在这里插入图片描述

//using namespace std;
//解决方法:
//	1.只展开std域中自己要用到的成员名 例:endl和cout
//	2.将rand放到自己的命名空间中 如LE中的rand
using std::endl;//局部展开endl
using std::cout;//局部展开cout
using namespace std;//将std C++官方库定义的空间全部展开,相当于把std命名空间全部放在了全局域中。

namespace LE
{
	int rand = 1;
	int Add(int x ,int y);//LE的Add声明
};

int LE::Add(int x ,int y)//命名空间外定义
{
	return x + y;
}

int main()
{
	cout << "rand = " << LE::rand << endl;//因为std命名空间中也有rand所以造成了命名冲突
						 //👆 域作用限定符,指定访问域名,如果当没有域名,默认访问全局。
	return 0;
}

   实际工作中尽量不要全局展开自己或者C++自带的命名空间域,应当遵循,什么变量或者方法用的频繁,就适当展开局部。或者指定使用 比如 std::cout

  • 命名空间可以嵌套
  • 如果要访问一个命名空间域的变量或者函数,必须指定命名空间(A::count)
  • 多个文件中的同名命名空间在编译过程中会合并在一起。

1.3 流入< < | 流出 > >运算符

  在C++中 << 和 >>代表流入和流出,是2个新的操作符。cout和cin相当于把 2 个运算符进行了运算符重载的函数定义,具体是什么是运算符重载,后序在类和对象中会进行解释。这里只是简单介绍下C++中这2个新的运算符。
在这里插入图片描述
png)

cin 和 cout会自动识别类型,需要像 C语言 中的printf 和 scanf 那样指定输入输出的值类型


2. 缺省参数

  缺省参数简单理解就是参数的默认值,当你没有给变量定义任何值或者你没有给形参传任何值过去时,此时缺省参数就会起到作用。
在这里插入图片描述

缺省值注意事项:

  • 缺省参数声明和定义不能同时给。(在声明设置缺省值)
  • 传参时不能跳用使用缺省值,必须从左往右连续传值。
  • 缺省参数必须从右往左连续设置。

2.1 缺省值的简单实际应用(栈)

在这里插入图片描述

struct Stack
{
public:
	int* _arr;
	int _top;
	int _size;
	Stack(int cap = 10)//构造函数,作用跟下面的Init作用差不多,用于自定义对象的初始化。
				  //👆cap的缺省值 构造函数在类和对象中会进行讲解
	{
		int* tmp = (int*)calloc(cap, sizeof(int));
		if (nullptr == tmp)
			return;
		_arr = tmp;
		_top = 0;
		_size = cap;
	}
};
//								       👇cap的缺省值									
void STInit(class Stack* ps, int cap = 10)
{
	int* tmp = (int*)calloc(cap, sizeof(int));
	if (nullptr == tmp)
		return;
	ps->_arr = tmp;
	ps->_top = 0;
	ps->_size = cap;
}

int main()
{
	Stack St;//创建一个栈

	STInit(&St);//这里不传参就默认开辟了10个int的空间。
	STInit(&St,20);//这里开辟了20个int的空间。
}

3. 函数重载⭐

 函数重载就是C++中允许同名函数的存在,但同名函数必须形参的个数、类型、类型顺序不同才能构成函数重载,返回值不同不构成函数重载。
 为什么C++支持函数重载,因为C++对于函数名有自己的函数名修饰规则,通过这个修饰规则即可找到对于的同名函数但是个数、类型、类型顺序不同的同名函数,C语言不支持函数重载是因为C语言没有函数名修饰规则。
 同名函数的单个参数带缺省值和无参的会造成歧义👇
虽然复合重载,但是有歧义

3.1 函数名修饰规则(Linux_g++编译器)

在这里插入图片描述


4. 引用⭐

 引用是C++中一个新的内置类型,引用不是定义一个新变量,而是给一个已经存在的变量取一个别名,该引用和被引用的对象都指向同一个内存空间,在底层上其实引用和指针的实现方式基本是一样的。为什么功能一样,却要还要设计一个引用呢,主要是为了解决指针在某些场景下太过于复杂。引用简化了指针的使用。

  • 引用必须初始化且引用不能指向空
  • 初始化后不能改变指向
  • 一个变量可以有多个引用
  • 引用可以被引用
    在这里插入图片描述

4.1引用的实际引用(单链表和顺序表)

单链表

在这里插入图片描述

顺序表

在这里插入图片描述

typedef struct SeqList
{
	int* _arr;
	int _size;
	int _capacity;

}SL;

void SeqInit(SL* ps)
{
	ps->_arr = (int*)calloc(10,sizeof(int));
	ps->_capacity = ps->_size = 10;
}

void SLPush(SL* ps,int x)
{
	ps->_arr[ps->_size] = x;
}

int& FindVal(SL& ps, int x)
{
	for (int i = 0; i < 10; i++)
	{
		if (ps._arr[i] == x)
			return ps._arr[i];
	}
}

int main()
{
	SL sl;
	SeqInit(&sl);

	for (int i = 0; i < 10; i++)
	{
		sl._arr[i] = i + 1;
		printf("%d ", sl._arr[i]);
	}
	

	cout << endl;

	FindVal(sl, 5) = 0;//利用引用返回修改顺序表中的对象

	for (int i = 0; i < 10; i++)
	{
		printf("%d ", sl._arr[i]);
	}


	return 0;
}

 ⭐引用的主要作用:减少拷贝 和 可以修改返回对象
 ⭐记住只有出了作用域还在的对象,才介意使用引用返回。

4.2 常引用

 引用和指针在赋值和初始化时,权限有放大和缩小的情况,所以当碰到这种情况时,我们要分析当前情况是否适合加上const。总之一句就是,当你不希望你的变量或者自定义变量内的值被改动时,此时在该变量前加上const即可。

  • 为什么 指针 和 引用在面对面对类型转换时需要const修饰(const修饰表示你不能通过这个指针/引用改变目标地址的存储内容),是因为指针和引用会改变原本对象的值,而之所以会产生隐式自动类型转换,就一定是因为指针类型与原对象的类型不匹配,因为每个对象对数据存储和处理的方式上可能所有不同(如double类型和int类型),如果类型转换的临时变量没有const属性,指针或者引用就能改变与指针类型不符的数据,到时候原对象的数据就会造成储存和处理上的错误。反之,相同类型的指针/引用在存储同类型普通变量的地址时,就不会有类型转换,则不需要const修饰。【仅个人理解】
  • 为什么像 (double b = 1.2) int a = b;这种代码不需要加const呢,因为 a 的改变不会影响 b,所以这里即使就算是不加const也不会报错,因为 a 和 b是两个独立的空间,互不影响,所以他们没有引用/指针权限放大和缩小的这种概念。
  • 权限的放大和缩小这个概念仅仅只用于指针和引用。

关于权限的啰嗦描述


5. 内联函数(inline)

 inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。C++推荐用内联函数替代宏函数

  • 内联函数不要定义和声明分别,因为内联函数不会进符号表,分离会导致链接错误
  • 内联是一种以空间(指编译出的程序大小)换时间的做法,减少了调用开销,提高效率,缺点是有可能使目标文件变大。
  • 内联函数一般只会展开短小的函数功能,内联函数对编译器来说只是一种建议,编译展开还是调用取决于编译器。
  • 内联函数相对于C的宏函数来说,内联函数可以调试,而且会进行类型和安全检查,容易掌握理解,宏则相反。(宏可以传任何值,而且不用建立栈帧)
    这里没有call操作

5.1编译链接复习图

在这里插入图片描述


6. auto自动类型识别

 aotu自动类型识别就是说会自动识别当前对象的类型,主要是为了解决当某一特定类对象名太长时用auto来自动识别该对象。
在这里插入图片描述

6.1 范围for

 范围for是一种快速遍历数组的函数方法,可以返回其数组内的值,也可以返回数组内的值的引用使其具备修改该值的功能。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值