C++11经典语法

本文介绍了C++11相较于C++98的显著改进,包括大括号的广泛初始化、auto类型的自动推导、decltype获取表达式类型、nullptr代替NULL、范围for循环以及final和override用于多态的虚函数控制。

       

目录

1、{}进行初始化

2、auto

3、decltype 

4、nullptr

5、范围for循环

6、final和override 

结语


前言:

        C++通常被分为两个大标准,即C++98和C++11。对于C++98而言,C++11在其基础上做了大量的更改与优化,改动之大以至于C++11更像一门“新语言”,不过C++11确实在使用层面得到了很大的提升,语法更加的稳定安全且功能强大,大幅度的提供了程序员的开发效率。

1、{}进行初始化

        在C++98中,大括号一般是用于数组或者结构体的初始化(struct默认成员为公有域,因此可以在外面直接给x和y赋值),示例如下:

#define _CRT_SECURE_NO_WARNINGS 1

struct A
{
	int x;
	int y;
};
int main()
{
	int arr[] = { 1, 2, 3, 4, 5 };
	A p = { 1, 2 };
	return 0;
}

        当到了C++11,大括号的初始化范围不再局限于数组和结构体,还能够初始化内置类型,并且用大括号进行初始化还可以省略赋值符号‘=’

#define _CRT_SECURE_NO_WARNINGS 1

struct A
{
	int x;
	int y;
};
int main()
{
	int a{ 2 };//等价于int a = 2/int a = {2}
	int array1[]{ 1, 2, 3, 4, 5 };
	A p{ 1, 2 };
	int* pa = new int[4]{ 0 };//开辟的空间中每个int类型的元素初始化为0
	return 0;
}

        并且对象也支持{}的初始化,{}会自动调用该对象的构造函数。

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;

class A
{
public:
	A(int x1,int y1)
		:x(x1)
		,y(y1)
	{}

	void Print()
	{
		cout << x << " " << y << endl;
	}
private:
	int x;
	int y;
};
int main()
{
	//C++98写法
	A p2(2,6);
	p2.Print();
	//C++11写法
	A p1 = { 1, 2 };
	A p{ 1, 2 };
	p1.Print();
	p.Print();
	return 0;
}

        运行结果:

2、auto

        在C++11中,auto是可以自动推导类型的,他可以识别等式右边的类型,并且把该类型赋予auto类型的对象。注意:auto定义的对象必须完成初始化 

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<map>
using namespace std;

int main()
{
	int i = 10;
	auto p = &i;
	auto pf = strcpy;
	//typeid可以观察对象的类型
	cout << typeid(p).name() << endl;//指针
	cout << typeid(pf).name() << endl;//函数指针
	string st1;
	auto it = st1.begin();
	cout << typeid(it).name() << endl;//迭代器
	return 0;
}

        运行结果:

3、decltype 

         decltype可以把一个表达式的类型给到decltype创建的对象。

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<map>
using namespace std;

int main()
{
	const int x = 1;
	double y = 2.2;
	decltype(x * y) ret; // ret的类型是double-算术转换
	decltype(&x) p;//p的类型是const修饰的指针
	cout << typeid(ret).name() << endl;
	cout << typeid(p).name() << endl;
	return 0;
}

        运行结果:

4、nullptr

        在C++98中,NULL表示的是字面常量0,因此很不明确,因为0既能表示指针常量又能表示整形常量,很不安全,因此在C++11中引入了nullptr的概念,他只表示空指针。

5、范围for循环

        范围for可以帮助程序员便捷的遍历容器内容,他的底层其实是去调用该容器的迭代器来实现的,但是使用起来的确很方便。

        范围for的用法:

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v1(5,1);
	for (auto num : v1)
	{
		cout << num << " ";
	}
	return 0;
}

        运行结果:

6、final和override 

         final和override也是在C++11时提出的,他们的使用场景主要是多态下的虚函数重写。其中final修饰虚函数,表示该虚函数不能被重写。

        final测试代码:

class A
{
public:
	virtual void A1() final {}//A1不能被派生类的虚函数发生重写
};
class B :public A
{
public:
	virtual void A1() { cout << "A" << endl; }
};

        override同样修饰虚函数,他修饰派生类虚函数如果没有重写基类的虚函数则会报错。override测试代码如下:

class A
{
public:
	void A1() {}
};
class B :public A
{
public:
	virtual void A1()override { cout << "A" << endl; }//A1如果没有重写基类的虚函数则会报错
};

结语

        以上就是关于C++11经典用法的讲解,C++11相对于C++98改变了许多。最后希望本文可以给你带来更多的收获!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安权_code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值