C++ 11中的新特性(常量/类型/关键字/指示符/表达式/函数/类)

一、新增变量和类型

类型:long long/constexpr/auto

常量:nullptr

关键字:decltype

指示符:using

1.long long类型:扩展精度浮点数,10位有效数字。

2.nullptr常量:用于生成空指针的方法。

int *p=NULL
int *p=0
int *p=nullptr

3.constexpr变量:由编译器来验证变量的值是否是一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化。

int t = 10;//错误
const int t=10;//正确
constexpr int q = t + 20;
cout << "q" << q << endl;

4.auto类型:由编译器通过初始值来推算变量的类型,其定义的变量必须要有初始值。

int i = 0;
const int ci = i;
auto b = &i; // b是一个整形指针(整数的地址就是指向整数的指针)
auto c = &ci; // c是一个指向整数常量的指针(对常量对象取地址是一种底层const)

5.decltype指示符:选择并返回操作数的数据类型。

const int ci = 0, &cj = ci;
decltype(ci) x = 0;
decltype(cj) y = x;
decltype(cj) z; //错误,因为cj是一个引用,因此作为引用的 z 必须要进行初始化

6.using类型别名:两种方法可以用来定义类型别名,一种是 typedef ,另一种则是新标准中的 using

using dnum = double;
using pstring = char*;

using func = int(int);
using pfunc = int(*)(int);

using arr = int[10];
using parr = int(*)[10];
using tparr = int(&)[10];

二、表达式

1.除法舍入规则:直接切除小数部分。

2.列表赋值用{}

3.sizeof可用于类成员:对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得结果求和;对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用多少空间。

4.for范围语句:容器遍历

vector<int> v={0,1,2,3,4,5,6,7};
//若想改变容器内元素的值,范围变量必须是**引用**类型
for (auto &r : v )  //对v中的每个元素
    r*=2;           //将v中的每个原素的值翻倍

三、函数

1.新增容器类cbegin和cend函数

2.新增标准库begin和end函数

3.列表初始化返回类型:可返回花括号包围的值的列表,如果列表为空,临时量执行初始化,否则,返回的值由函数的返回类型决定。

vector<string> getAddress(int num) {
    if (num == 0) {
        return {};
    }
    return {"address1", "address2", "address3"};
}

4.定义尾置返回类型

// 返回类型为指针,该指针指向含有10个整数的数组
auto func(int i) -> int(*)[10] {
    int arr[10] = {0};
    return &arr;
}

四、类

1.使用=default生成默认构造函数:如果实现了默认的构造函数,编译器则不会自动生成默认版本;可以通过使用关键字 default 来控制默认构造函数的生成,显示的指示编译器生成该函数的默认版本。

class MyClass{
public:
    MyClass()=default;  //同时提供默认版本和带参版本
    MyClass(int i):data(i){}
private:
    int data;
};

2.使用delete禁止使用默认构造函数。

class MyClass
{
public:
    MyClass()=default;
    MyClass(const MyClass& )=delete;
};

int main() {
    MyClass my;
    MyClass my2(my); //报错

    return 0;
}

3.可以使用类内初始化

4.提供委托构造函数:一个委托构造函数使用它所属类的其它构造函数可以执行它自己的初始化过程。

class MyClass
{
public:
    MyClass() : MyClass(10) {}
    MyClass(int d) : data(d){}

    inline int getData() {return data;}
private:
    int data;
};

int main() {
    MyClass my;
    cout << my.getData() << endl;
    return 0;
}

5.constexpr构造函数:如果成员函数标记为 constexpr,则默认其是内联函数,如果变量声明为constexpr,则默认其是 const。

class Square {
public:
    constexpr Square(int e) : edge(e){};
    constexpr int getArea() {return edge * edge;}
private:
    int edge;
};

int main() {
    Square s(10);
    cout << s.getArea() << endl;
    return 0;
}

参考资料:http://www.cnblogs.com/George1994/p/6684989.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值