既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
int\* ptr1 = new int[] {1, 2, 3};
Test\* ptr2 = new Test[]{ {1, 1.1}, {2, 2.2} };
对于自定义类型{}
会调用它的构造函数初始化:
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
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
-6y5U4hsK-1715722960117)]
[外链图片转存中…(img-nZAJPLLR-1715722960118)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新