首页 > 编程语言 >C++11新特性(三):语言特性

C++11新特性(三):语言特性

时间:2024-08-24 10:37:03浏览次数:4  
标签:11 转换 函数 Parent int void C++ 特性 MyClass

C++11新特性

范围for循环

std::vector<int> nums;
for (auto it : nums){
    cout << *it << endl;
}
array<5, int> a{1, 2, 3 ,4 ,5};
for (auto x : a){
    x *= 2; // 此时a中元素不会发生改变a{1, 2, 3, 4, 4}
}
for (auto& x : a){
    x *= 2; // 此时a中元素会发生改变a{2, 4, 6, 8, 8}
}
for_each(a.begin(), a.end(), [](int x){x*=2;}) // a中元素不会发生改变

移动语义特殊成员函数

参见st::move()实现移动构造函数和移动赋值运算符

转换构造器

转换构造器支持花括号列表语义到参数的转换

class MyClass{
pulic:
    MyClass(int){}
    MyClass(int, int){}
};
MyClass b{1,2};

显式转换函数

explict可用于类构造器和运算符中禁止隐式转换,比如禁止基础数据类型直接隐式转换为类对象。

class MyClass{
     explict MyClass(int){
    	/* code */
	}  
};
void Func(MyClass a){
    
}
MyClass a(1.1); // OK, 只是float->int的隐式转换,不涉及到类对象的转换,此时是可行的。
Func(1.1); // Error, 此时会涉及float->MyClass的隐式转换,但是由于explict声明会拒绝隐式类型转换
Func(MyClass(1.1)); // OK, 显示指明转换类型

内联命名空间

内联空间可以使该空间像是父空间的一部分。

namespace Parent{
    namespace Cousin{
        void GetCousinName(){}
    }
    inline namespace Son{
        void GetSonName(){}
    }
}
Parent::Cousin::GetCousinName(); // 嵌套的命名空间的作用域在嵌套作用域中,也是侄子有私人空间
Parent::GetSonName(); // 内联命名空间作用域在父空间中,儿子没有私人空间。
using Parent::Cousin::GetCousinName; // 导入命名空间中的函数
GetCousinName();
namespace cousin = Parent::Cousin; //命名空间别名

非静态数据成员初始化

C++11允许非静态成员初始化。

class Cat{
    Cat(int a) : val(a){}
    int val = 0; // 允许非静态成员直接初始化
    int name {0};
};

右角括号

map<map<int, int>>; // C++11才支持可以无空格连续右角括号

引用限定成员函数

引用限定成员函数能够检查对象的*this是一个左值引用还是右值引用

class Cat{
public:
    Cat(int a) : val(a){}
    void GetName() &{
        cout << "lvalue" << endl;
    }
    void GetName() &&{
        cout << "rvalue" << endl;
    }
private:
    int val = 0; // 允许非静态成员直接初始化
    int name {10};
};
int main()
{
    Cat s(5);
    s.GetName(); // 左值调用GetName() &
    move(s).GetName(); // 右值引用调用GetName() && 
    Cat&& m = move(s);
    m.GetName(); // lvalue,此时就会出现右值传入时会退化为左值
}

尾部返回类型

允许使用->来为lambda和不明确函数返回类型指定返回类型。

auto Func1() -> int{
    /* code */
}
auto Func2 = []() -> int{};

noexcept限定符

noexcept关键字告诉编译器该函数不会抛出任何异常,从而允许编译器优化。如果抛出了异常,会用std::terminate终止程序运行。可以省略一些编译器生成一些异常处理代码。可以是条件性判断抛出异常。noexcept常用于修饰需要更改资源访问的函数,比如默认构造函数、析构函数、移动构造函数、移动赋值运算符、拷贝构造函数、拷贝赋值运算符。

void Add(int a, int b) noexcept{
    // 不会抛出任何异常
}
void AddIf(int a, int b) noexcept(false){
    // 可能会抛出异常
}

char32_tchar16_t标准类型

char32_t char16_t代表UTF-8字符串(1-4个字节)

原始字面字符串

举例完成对原生字面字符串语法的展现

const char* str = "hello,\nworld\n";
// 等价于
const char* str = R"(hello,
world)";

标签:11,转换,函数,Parent,int,void,C++,特性,MyClass
From: https://www.cnblogs.com/solicit/p/18377503

相关文章

  • Java 12 新特性—Switch 表达式
    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析......
  • Java 12 新特性—新增 String API
    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析......
  • C++学习,关键字
    列表是C++中的保留字,这些保留字不能用作常量或变量或任何其它标识符名称:asmelsenewthisautoenumoperatorthrowboolexplicitprivatetruebreakexportprotectedtrycaseexternpublictypedefcatchfalseregistertypeidcharfloatreinterpret_casttypenameclassforreturnunionconstfr......
  • C++学习, 变量作用域
    从广义上看,有三个地方,可以声明变量:在函数或块中声明的变量,为局部变量。在函数参数定义的变量,为形式参数。在所有函数之外的变量,为全局变量。局部变量(LocalVariables)在函数或块内声明的变量是局部变量。它们只能由该函数或代码块中的语句使用。本地变量不为其自......
  • C++11新特性(二):语言特性
    C++11新特性语言特性nullptr空指针nullptr空指针的使用可以规避掉以往设置为NULL的风险。NULL在编译器中常常被设置为0或者其它数字,此时判断指针是否为NULL,即判断指针类型是否能够等于整型值,并不安全。int*p=nullptr;强类型枚举强类型枚举不能隐式转换为int类型,可以指定......
  • C++学习笔记----4、用C++进行程序设计(五)---- 非复合与继承关系
        在考虑类之间到底是什么关系时,要首先考虑一下是否真的有关系。不要搞有罪推定,直接问犯了什么罪,要先看是否是犯罪行为。不要让你对面向对象的设计的热情转变为大量不需要的类或者继承的类的关系中。    有一个大家都容易陷入的怪圈就是在现实世界中很明显......
  • dotnet X11 多次调用 XPutImage 是否能做到渲染同步
    本文将告诉大家我在麒麟系统和统信系统以及分别搭配飞腾和兆芯处理器的设备上,使用连续的XPutImage方法推送界面,测试是否能够在一次渲染内完成。测试结论是不能做到渲染同步本文的核心测试代码如下XPutImage(display,handle,gc,refxImage,@event.ExposeEvent.x,@......
  • C++基础干货笔记!
    目录一、C++的第一个程序:二、命名空间namespace:1.namespace的定义:2.namespace的使用三、C++输入与输出四、缺省参数 定义与注意:五、函数重载六、引用1.引用的概念2.引用的特性3.const引用 4.引用和指针的关系六、inline1.概念与使用事项:七、nullptr概念:......
  • (2024最新毕设合集)德阳香树园游泳馆管理系统-50428|可做计算机毕业设计JAVA、PHP、爬虫
    德阳香树园游泳馆管理系统的设计与实现摘 要本文介绍了德阳香树园游泳馆管理系统的设计与实现。该系统采用B/S模式,使用Java语言开发,借助SSM框架和MySQL数据库进行后台支持。此外,还结合微信小程序框架Uniapp进行开发,以提供更便捷的用户体验。德阳香树园游泳馆管理系统旨在......
  • C#/asp.net-智能制造业ERP系统-89973(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP
    C#(asp.net)智能制造业ERP系统摘 要随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用C#技术建设智能制造业ERP系统。本设计主要实现集人性化、高效率......