2024年大数据最全【C++】C(1),2024年最新大数据开发高级工程师必看系列

img
img

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

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

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

class Date
{
public:
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
		std::cout << "Date(int year, int month, int day)" << std::endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(1, 2, 3);
	Date d2{1, 2, 3};
	return 0;
}

在这里插入图片描述
其他一些不方便初始化的地方使用, 比如stl的初始化, 如果不使用这种方式, 只能用构造函数来初始化, 难以达到效果 。

int main()
{
	std::vector<int> v={ 1, 2, 3, 4, 5 };// 列表初始化
	std::list<int> lt{ 1, 2, 3, 4, 5, 6 };// 列表初始化
	for (auto& e : v)
	{
		std::cout << e << " ";
	}
	std::cout << "\n";
	for (auto& e : lt)
	{
		std::cout << e << " ";
	}
	std::cout << "\n";
	return 0;
}

在这里插入图片描述
这里明显不是使用构造函数初始化的
那么这里是怎么做到的呢?
利用std::initializer_list类型。

1.2 initializer_list类型

int main()
{
	auto tmp = { 1, 2, 3, 4 };
	std::cout << typeid(tmp).name() << std::endl;
	return 0;
}

在这里插入图片描述typeid(变量名).name() 查看变量的类型
我们可以把它理解为一个存在常量区数组
这个容器有以下接口:
在这里插入图片描述
这样我们就可以像迭代器一样使用这个容器。
所以vector和list就可以这样初始化:
在这里插入图片描述
在这里插入图片描述
其实使用initializer_list初始化就是遍历initializer_list的内容然后一个一个插入。

vector(initializer_list<T> il)
	:\_start(nullptr)
	, \_finish(nullptr)
	, \_endofstorage(nullptr)
{
	reserve(il.size());// 防止过度扩容
	typename initializer\_list<T>::iterator it = il.begin();
	while (it != il.end())
	{
		push\_back(\*it);
		++it;
	}
}

二、类型推导

2.1 auto

auto的作用就是自动推导对象的类型。从这个意义上讲,auto并非一种"类型"声明,而是一个类型声明时的"占位符",编译器在编译时期会将auto替换为变量实际的类型。

double foo()
{
	return 1.1;
}

struct Test
{};

int main()
{
	// 内置类型
	int a = 1;
	auto b = a;// int
	auto c = foo();// double

	// 自定义类型
	Test test;
	auto ret = test;// struct Test
	return 0;
}

2.2 auto注意事项

1️⃣ 首先定义变量的时候一定要初始化

auto a;// error
a = 10;

2️⃣ 不能作为函数的形参

void func(auto a) {}// error

3️⃣ 变量不能作为自定义类型的成员变量

struct Test
{
	auto a = 1;// error
};

4️⃣ 不能是auto数组

auto arr[] = { 1, 2, 3 };// error

5️⃣ 模板实例化类型不能是auto类型

std::vector<auto> v;// error

2.3 decltype

关键字decltype将变量的类型声明为表达式指定的类型。我前面用的typeid(x).name()可以拿到x类型的字符串,但是不能使用这个再去定义一个变量。
而decltype却可以拿到变量,后面还可以继续使用这个类型定义出变量。

int main()
{
	int x = 0;
	decltype(x) a = 10;// int
	double y = 0.0;
	decltype(x + y) b;// double
	return 0;
}

三、新增与改进

3.1 nullptr

nullptr 是为了解决原来 C++中 NULL 的二义性问题而引进的一种新的类型,因为NULL既能表示整型也能表示指针。

#ifndef NULL
#ifdef \_\_cplusplus
#define NULL 0
#else 
#define NULL ((void \*)0)
#endif 
#endif /\* NULL \*/

3.2 范围for

在 C++中 for 循环可以使用基于范围的 for 循环,示例代码如下:

int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6 };
	for (int& e : a)
	{
		std::cout << e << " ";
	}
	std::cout << '\n';
	return 0;
}

3.3 array

template < class T, size_t N > class array

array就是个数组,它跟vector的区别是array是静态数组,不能扩容。
那么它跟普通数组有什么区别呢?

img
img

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

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

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

[外链图片转存中…(img-iLIhzmkK-1715596031795)]

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值