C++11新特性汇总(更新中)

来源于对C++Primer内容的理解或者可以说成个人笔记

1.long long

长整型64位、带符号

2.列表初始化


int main()
{
    
    
	int a{
    
    2};
	int b{
    
    1}, c{
    
    2};
	int d = {
    
    0};

	//上述写法等同于
	int e= 0;
	cout << a << b << c << d << e;
	return 0;
}

在这里插入图片描述

3.nullptr常量

int main()
{
    
    
	{
    
    
		#include <cstdlib>
		int *m = NULL;
	}
	int *p = 0;
	int *q = nullptr;
	//上述三种写法相同
	return 0;
}

4.constexptr常量

将变量声明为constexpr以便于有编译器判断变量的值是否是一个常量表达式。

constexpr int fun()
{
    
    
	return 8;
}

int main()
{
    
    
	constexpr int a = 10;
	constexpr int b = a+1;
	constexpr int c = fun();//此处fun()必须为constexpr
	return 0;
}

5.类型别名

关键字:typedef、using
可以给类型名称起一个外号,例如:

int main()
{
    
    
	using i = int;
	typedef int j;
	typedef int k, *p;

	int a = 1;
	i b = 2;
	j c = 3;
	k d = 4;
	p e = &d;

	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	cout << endl << "注意这里的p定义的e和其他的有什么不同:"<< endl;
	cout << typeid(*e).name() << endl;
	cout << typeid(e).name() << endl;
	return 0;
}

在这里插入图片描述

6.auto类型指示器

根据表达式自动分析变量类型。类似于C#中的var

int main()
{
    
    
	auto a = 1;
	auto b = 1.1;
	auto c = "asd";
	auto d = 'a';
	auto e = true;

	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	cout << typeid(e).name() << endl;
	return 0;
}

在这里插入图片描述

7.decltype类型指示符

decltype(变量或方法) a = 0;
eg:


int main()
{
    
    
	int a = 1;
	const int &b = a;
	decltype(a) c = 0;//const int 
	decltype(b) d = b;//cinst int&
	//decltype(b) e;  错误写法

	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	return 0;
}

8.类内初始值

C++11新标准规定,可以为数据成员提供一个类内初始值

9.范围for语句

一个修改字符串的例子(包括范围for的用法,修改和遍历)

void print(string str)
{
    
    
	//循环输出
	for (auto i : str)
	{
    
    
		cout << i;
	}
	cout << endl;
}

int main()
{
    
    
	string str = "hello world!";
	
	cout << "修改str" << endl;

	for(auto &i : str)
	{
    
    
		i = toupper(i);
	}

	print(str);
	return 0;
}

在这里插入图片描述

10.vector

1.初始化方法:

	vector<int> a;
	vector<int> b = a;
	vector<int> c(a);
	vector<int> d(3,6);
	vector<int> e(3);
	vector<int> f{
    
    1,2,3,4,5};
	vector<int> g = {
    
    1,2,3,4,5};
bool isEmpty = f.empty();//判断是否为空
int size = f.size();//返回vector元素数量

2.添加元素

不能使用下标添加元素!!!
不能使用下标添加元素!!!
不能使用下标添加元素!!!
正确示例:

int main()
{
    
    
	vector<int> a;
	a.push_back(1);
	a.push_back(2);
	return 0;
}

11.标准库函数begin和end

begin:返回数组的首个元素的指针
end:返回数组最后一个元素的下一个位置的指针

int main()
{
    
    
	int a[5] = {
    
    1,2,3,4,5};
	int *pbeg = begin(a);
	int *pend = end(a);

	//对pbeg进行姐引用看看是不是第一个元素
	cout << *pbeg << endl;

	//输出数组最后一个元素地址和pend的地址
	cout << pend << " " << &a[4] << endl;
	return 0;
}

在这里插入图片描述
根据输出结果,输出数组最后一个元素地址和pend的地址进行比较,可以看出pend的地址在最后一个元素之后的下一个位置,即两地址差为4

12.除数的舍入规则

C++11商一律向0取整
即:5/2 = 2
-6/4 = -1

早期-6/4 = -2

13.sizeof运算符

sizeof返回目标所占大小,返回类型是size_t(机器相关的无符号类型,足够大)
sizeof(type)
sizeof expr
eg:

class A
{
    
    
public:
	int a;
	double b;
	char c;
};
int main()
{
    
    
	A a, *p;
	cout << sizeof(A) << endl;
	cout << sizeof(a)<< endl;
	cout << sizeof(p) << endl;
	cout << sizeof(*p) << endl;
	cout << sizeof(a.b) << endl;
	cout << sizeof(A::b)<< endl;
	return 0;
}

在这里插入图片描述
上述代码中对空指针p进行解引用并没有报错,证明sizeof并没有执行运算对象的值,并通过A::b可以看出,我们使用sizeof也无需使用一个对象

sizeof对vector和string进行返回时,值返回string和vector的固定部分大小。( 圈起来,重点考)
eg:

int main()
{
    
    
	vector<int> a{
    
    1,2,3,4,5};
	cout << sizeof(a) << endl;

	vector<int> b{
    
    2,3,4,5};
	cout << sizeof(b) << endl;
	return 0;
}

在这里插入图片描述

14.initializer形参

同名头文件
如果一个函数不确定参数的数量 则可用此。
eg:

void print(initializer_list<string> list)
{
    
    
	for(auto pbeg = list.begin(); pbeg != list.end(); pbeg++)
	{
    
    
		cout << *pbeg;
	}
}
int main()
{
    
    
	string a = "\t\t草\n";
	string b = "\t\t\t李白(不许笑,就是我写的,我的草,我草!!!)\n";
	string c = "\t离离原上草,\n";
	string d = "\t越赚钱越少。\n";
	string e = "\t你若喜欢看,\n";
	string f = "\t一会点个赞。\n";
	print({
    
    a});
	print({
    
    b,c,d,e,f});
	return 0;
}

initializer_list的值默认是const,不能改变

15 .列表初始化返回值

vector<int> print()
{
    
    
	return {
    
    1,2,3};
}
int main()
{
    
    
	for(auto x : print())
	{
    
    
		cout << x << endl;
	}
	return 0;
}

在这里插入图片描述

16.使用尾置返回类型和decltype

eg:

//尾置返回类型
auto func(int i) -> int(*)[10];
//decltype
decltype(sth) *arrptr(int i)
{
    
    
	return **;
}

17.使用=default生成默认构造函数

众所周知,一个类没有显式的写出构造函数,编译器会默认生成一个无参构造函数,反之不会生成,那么我们既需要默认的构造参数,有需要自定义的构造参数可以用如下代码告诉编译器来生成默认的构造参数:

className = default;

18.constexpr构造函数

//TODO 没太理解,以后加上
在这里插入图片描述

19.array和forward_list

和vecor差不多,不说了
在这里插入图片描述

20.容器的非成员函数swap

除了array外,swap只交换两个容器的内部结构,指针,引用,迭代器所绑定的元素不会改变。

eg:swap(vector1, vector2)

21.容器emplace

调用insert和puh都是将元素类型的对象传递给他们,这些对象被拷贝到容器中。
emplace是直接将参数传递给元素类型的构造函数,emplace使用这些参数直接在容器管理的内存中构造元素
eg:

class A
{
    
    
	public:
	int a;
	A(int a)
	{
    
    
		a = a;
	}
};
int main()
{
    
    
	vector<A> c;
	c.push_back(A(1));
	c.emplace_back(1);
	return 0;
}

22.shrink_to_fit

C++11标准中,可以调用shrink_to_fit要求deque,vector或string退回不需要的内存空间。但是具体的实现可以选择性忽略此语句。也就是说不一定会退回空间。

23.string的数值转换函数!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43679333/article/details/107997419
今日推荐