欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

高速上手C++11 14 笔记1

程序员文章站 2022-10-04 16:45:39
1 constexpr constexpr关键字可以让已经具备常量返回的函数运用于常量的位置。 c++14起可以在函数内部使用局部变量、循环和分支等简单语句。 2 委托构造&继承构造 委托构造使得避免了多个构造函数调用一个私有函数的丑陋代码。 class Base { public: int val ......

1 constexpr

constexpr关键字可以让已经具备常量返回的函数运用于常量的位置。

c++14起可以在函数内部使用局部变量、循环和分支等简单语句。

2 委托构造&继承构造

委托构造使得避免了多个构造函数调用一个私有函数的丑陋代码。

class Base {
public:
    int value1;
    int value2;
    Base() {
        value1 = 1;
    }
    Base(int value) : Base() { // deletgate constructor
        value2 = 2;
    }
};

继承构造解决了子类调用父类构造函数时依次传入变量效率低下的问题。

class Subclass : public Base {
public:
    using Base::Base; // Inheriting constructor
};

由此传参效率问题目前已有一下解决方案:

1、构造函数的继承构造

2、inline或macro的代码替换

3、移动语义、完美转发。(move强制转化为rvalue,forward保留原值的左右属性)

显式虚函数重载(final&override)

struct Base {
    virtual void foo();
};

struct SubClass : public Base {
    void foo();
};

以上代码中,subclass的foo方法语义模糊,当base类不得不移除foo方法时subclass的foo依然能够运作,这是非常严重的后果。

struct Base {
    virtual void foo(int);
    virtual void foo2() final;
};

struct SubClass : public Base {
    virtual void foo(int) override;         virtual void foo(double) override; // ERR
    void foo2(); // ERR
};

拒绝编译器做小动作(default&delete)

class Magic {
public:
    Magic() = default; // explicit constructor
    Magic& operator=(const Magic&) = delete; // explicit refuse = operator
    Magic(int magic_number);
};