C C++最全学习新特性,带你做C++学习的弄潮儿!!(3),花了19998买的学习教程

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

1. 空指针初始化

在C语言中我们使用NULL来初始化空指针:

int\* ptr = NULL;

在C++11新特性下引入了一个特殊的字面值nullptr,它可以被转换成任意其他类型的指针:

int\* ptr = nullptr;

相比一下,在C++中,NULL被定义为0,这根本就不是一个指针变量,它就是一个简单的变量0罢了:

    #ifdef \_\_cplusplus
        #define NULL 0 //C++中是这样定义的
    #else
        #define NULL ((void \*)0)
    #endif

类似下面这种情况,如果使用nullptr我们只能初始化指针变量,而NULL可以初始化指针变量和普通变量,这样就会导致二义性的出现,NULL到底是一个指针变量还是一个普通变量呢?所以在C++中我们最好是使用nullptr来初始化指针变量

	int\* ptr = NULL;
	int\* ptr1 = nullptr;
	int a = NULL;//合法
	int b = nullptr;//非法

2. auto类型

有时候我们苦于准确的记住一些返回值类型,所以不知道声明变量的过程中具体应该声明什么类型?C++11帮助我们解决了这个难题,我们可以使用auto来声明一个变量,它会根据初始化的值来推断变量应该成为什么类型,比如:

	int a = 2;
	int\* ptr = &a;
	auto c = a;   //c为int类型变量
	auto d = ptr; //d为int\*类型的指针变量

使用auto可以动态分配内存吗?of course!

	int a = 2;
	int\* ptr = &a;
	//c为a所指向类型的一个指针,此处c为int\*指针
	auto c = new auto(a);   //并且指针指向的地址是&a

在这里插入图片描述
注意:使用new auto时,只能使用单个变量来初始化,为了让编译器准确判断想要分配的类型!也就是说不能使用auto分配数组!

3. decltype类型

这个类型和auto是有点相似的,我们用auto声明的变量去承接了未知类型的一个函数返回结果,但是有时候我们就只是想知道返回类型是啥,又不想调用这个函数,那我们可以怎么办?decltype应运而生。

	int a = 2;
	int\* ptr = &a;
	decltype(sizeof(int)) c; 

	//d此时为引用类型,必须初始化
	decltype(\*ptr) d;

此时我们声明的c是一个sizeof函数的返回类型,unsigned int类型的未初始化的变量c。此时d这里会报错,因为d是一个引用变量,必须给它一个初始化值!
在这里插入图片描述

4. 范围for循环

范围for循环是一个非常简洁的for循环语句,并且对于程序的安全性也全面提升,使用这种for循环语句,可以有效防止数组越界,因为普通的for循环不会检测数组越界问题,一旦越界,会产生不可预知的错误,所以还是相对来说比较危险的。有关范围for循环的使用举例,之前我有写过博客,点击这里:C++11新标准之范围for语句。我个人还是非常建议去使用新的for循环来代替旧的for循环写法。

5. lambda表达式

lambda表达式就是一个可调用的代码单元,这个调用单元可以传参,类似于函数一样,不过这个函数一般比较精致小巧,我举个简单的使用例子:

	int a = 1;
	int b = 2;
	//比较参数的大小
	auto Lambda_Function = [](const int a, const int b) {return a < b; };
	bool IsOk = Lambda\_Function(a, b);

6. 类型别名声明

类型别名类似于我们生活中给人起的小名,就是虽然是不同的名字,但是都是叫同一个人!这里所说的类型别名也是这个意思,只要能用到这个类型的地方,都可以用别名去代替!对于类型别名我们应该并不陌生,因为使用typedef就可以搞定一个变量类型别名的声明。

    typedef int III;
	III a = 2;//int型的变量
	int b = 3;

这个东西对于初学者来说不是那么友好,因为在声明时候,感官上看来不是很直观,于是C++11有了一种新的定义类型别名的方式。

	typedef int III;
	using II = int;
	III a = 2;
	int b = 3;
	II c = 4;

相比于使用typedef,使用using的时候,可以看到惯用的 = 思维,这个也就是告诉我们左边和右边类型一样!!是相等的!更容易记忆和学习的一种声明类型别名的方式。我们可以从结果截图上看到,上面的三个变量都是int类型的变量。
在这里插入图片描述

7. 列表初始化

C++11新标准用花括号来初始化变量,举个例子:

int b{3};
int b = 3;

这两个语句的初始化效果是一样的,列表初始化不仅可以应用于简单的类型变量,也可以使用在标准库类型初始化,拿vector举例:

	vector<int> v1{ 1,2,3,4,5 };

使用列表初始化完成对vector数组的初始化时候,也可以在函数调用中作为返回值进行返回。

vector<string> Function\_1()
{
	return { "Hello","KookNut","Hello","Boys" };
}
vector<int> Function\_2()
{
	return { 1,2,3,4,5,6 };
}

就这些?那动态申请内存时候呢?也可以的!

	//动态分配内存 并且进行列表初始化
	vector<int>\* v1 = new vector<int>{1,2,3,4,5,6,7};

8. 标准库函数begin、end

使用begin()函数返回指向数组a的首地址的指针,end()指向数组a的最后一个元素的下一个元素处的地址:

	int a[5] = { 1,2,3,4,5 };
	int\* ptr_begin = begin(a);
	int\* ptr_end = end(a);
	while (ptr_begin != ptr_end)
	{
		cout << \*ptr_begin << endl;
		++ptr_begin;
	}

使用标准库的这两个函数,可以保证指针安全的对数组成员解引用,需要注意的一点就是不要对尾后指针进行解引用和递增的操作。

9. constexpr函数

constexpr是用于常量表达式的函数,我们从这个词语的组成上就可以看出来,它以const开头,那如果这个函数中出现的形参和返回值不是字面值类型的时候,是行不通的,因为编译器在编译阶段需要把这个函数给替换掉,所以必须是常量,才可以让编译器顺利的识别并替换!

//错误,string属于非字面值类型
constexpr int Function\_3(string a)
{
	return a;
}

我们可以看出它的函数声明定义和普通函数没什么区别,需要注意的是返回值也只能有一条return语句,有且只能有一条!constexpr函数也会被展开,被隐式的指定为内联函数了。

constexpr int Function\_3(int a)
{
	return a \* 5;
}
void main()
{
	int i = 6;
	constexpr int a1 = Function\_3(2);
	constexpr int a2 = Function\_3(i);
}

10. 容器中的cbegin、cend

容器中的cbegin、cend是为了得到const_iterator,我们都知道容器中的begin和end可以获得操作容器的迭代器,但是我们有时候也需要const类型的迭代器,那C++11就再一次满足我们,这两个函数和begin、end函数的作用非常的类似,如果我们只需要对容器进行读,而不需要进行写操作的时候,可以使用它来获取元素。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[外链图片转存中…(img-nCEOuJ8f-1715706257711)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值