C++11新特性详细

本文探讨了C++中的auto类型推导和decltype类型获取,包括auto用法注意事项、两者结合的场景,如追踪返回类型和静态断言,以及constexpr常量表达式的应用。同时涵盖了final、override和default/delete关键字在类和函数上的作用。
摘要由CSDN通过智能技术生成

auto 类型推导

auto自动类型推导,用于从初始化表达式中推导出变量的类型,从这个意义上讲,auto并非一种类型声明,而是一个类型声明时的占位符,编译器会在编译期时将auto替换为变量实际的类型。

auto a = 1;    //ok  自动推导出a为int

auto b = 2.0;   //ok 自动推导出b为 double

vector<int> v;
auto iterator = v.begin();        //ok自动推导出 vector::iterator

auto 使用注意事项:
1、定义变量必须初始化

​ auto a; // error 未初始化的变量无法使用auto自动推导出类型

2、函数形参一般不能是auto变量(部分编译器可以通过)

​ void func(auto c) //error 函数入参不能是auto变量

3、auto 变量不能作为自定义类型的成员变量

​ class Test{

​ int a;

​ auto b; //error 类的成员变量类型不能是auto

​ };

4、模板实例化类型不能是auto变量

​ vector b={1}; //error

5、auto不能是数组

​ auto b[3] = {1,2,3};

decltype

decltype可以从一个变量或表达式中得到其类型

int i;
decltype(i) j = 0;
//typeid可以查看变量类型
cout<<typeid(j).name()<<endl;  // 需要包含#include <typeinfo> 

float a;
double b;
decltype(a + b) c;
cout<<typeid(c).name()<<endl;


vector<int> tmp;
decltype(tmp.begin()) k;

auto和decltype结合场景

追踪返回类型

返回类型后置,在函数名和参数列表后指定返回类型

template<typename T1, typename T2>
auto add(T1 &t1, T2 &t2) ->decltype(t1 + t2)
{
	return t1 + t2;
}

调用:
auto a =1;
auto b = 2.5;
auto c = add(a, b);

静态断言(static_assert)

C++本身提供了调式工具assert,这是一个宏,用于在运行阶段对断言进行检查,如果条件为真,执行程序,否则调用abort() 这是运行时检查

 	bool flag = false;
    assert(flag == true); //这里flag!= true不会继续运行
    cout<<"Hello C++"<<endl;

C++11中提供了静态断言机制(static_assert),可以在编译阶段对断言进行测试,可以更早发现各种功能错误。

语法如下:
static_assert(常量表达式, 提示字符串)

注意:只能是常量表达式,不能是变量

static_assert(sizeof(void*) == 4, "64bit 系统不支持");

noexcept

如果函数不会抛出异常,则在函数最后加上noexcept

void func() noexcept

{

​ ****************

}

常量表达式

常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行的时候

(直接在编译时就做一次,而不是运行时都计算,提升性能)

C++11中可使用constexpr

constexpr int getNum()
{
    return 3;
}

constexpr int tmp = getNum(); //ok  发生在编译阶段

constexpr函数的限制:

1、函数只能有一个return语句
2、函数必须有返回值 (不能时void)
3、在使用前必须已有定义
4、return返回语句表达式中不能使用非常量表达式的函数、全局数据且必须时一个常量表达式

类中成员是常量表达式

class MyTest{
public:
    //constexpr修饰构造函数,构造函数体必须为空,通过参数初始化列表进行构造
    constexpr MyTest(int y, int m, int d):year(y),month(m),day(d)
    {
        
    }
    constexpr int getYear()
    {
        return year;
    }
    constexpr int getMonth()
    {
        return month;
    }
    constexpr int getDay()
    {
        return day;
    }

private:
    int year;
    int month;
    int day;
};

调到用:
 constexpr MyTest test(2017,10,10); //必须使用常量给构造函数传参

final与override

final修饰类

表示阻止类的派生(继承), 被final修饰的类不能在被继承

class A final{

};

class A1: public A{} //error A类时final不能被继承

final修饰类的成员函数

class B{
public:
	virtual void func() final   //final修饰的虚函数不能被重写
	{}
};

class B1: public B{
	virtual void func()     //error 子类不能重写父类final修饰的虚函数
}

override

override用在子类重写父类的虚函数时加上override

class A1{
public:
	virtual void func(int a)
	{
	
	}
};

class A2: public A1{
public:
	//在重写父类的虚函数地方加上override   要求重写的虚函数的函数签名和父类一样否则会报错提示
	virtual void func(int a) override
	{
	
	}
};

default与delete

default

函数模板的默认模板参数

1、普通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值