美文网首页
C++ 编程技巧与规范(一)

C++ 编程技巧与规范(一)

作者: e196efe3d7df | 来源:发表于2020-11-19 11:36 被阅读0次

静态对象的探讨

类中静态成员变量

静态成员变量,需要先声明,然后再定义。如果没有使用到该静态成员变量,则可以不用定义。如果使用到了该静态成员变量,但是只做了声明,没有去定义,就会报链接错误。

namespace demo1 {
    class A {
    public:
        A() {
            m_i = 0;
            std::cout << "A的构造函数被执行!" << std::endl;
        }
        ~A() {
            std::cout << "A的析构函数被执行!" << std::endl;
        }
    public:
        int m_i;
    };

    class B {
    public:
        static A a;     //声明
    };

    A B::a;     //定义 一般是放在cpp文件里面
}

int main()
{
    demo1::B b;
    std::cout << "B::A::m_i:" << b.a.m_i << std::endl;
}

运行结果如下:


注意:类中的类类型静态成员变量,如果定义了,但是没有使用,依旧会生为该成员变量分配内存空间(构造)。
如果静态成员变量不是类类型,是基本类型(int, float...),且源码中没有用到过这个静态成员变量,编译器很可能不为该变量分配内存。
c++17中引用了inline关键字,可以将静态成员变量的声明和定义同时处理,即不用再cpp中对静态成员变量进行定义。

inline static A a;      //声明 + 定义

函数中静态对象

如果函数没有被调用过,则静态对象就不会被构造,即使函数被调用多次,该对象也只会被构造一次。整个程序退出时,才被析构。

namespace demo1 {
    class A {
    public:
        A() {
            m_i = 0;
            std::cout << "A的构造函数被执行!" << std::endl;
        }
        ~A() {
            std::cout << "A的析构函数被执行!" << std::endl;
        }
    public:
        int m_i;
    };

    void myFunc()
    {
        static A a;
    }
}

int main()
{
    demo1::myFunc();
    demo1::myFunc();
    demo1::myFunc();
}

运行结果如下:


从运行结果可以看出,myFunc调用三次,函数中的静态对象,只被构造一次。

全局对象的构造顺序

如果一个项目中有多个.cpp源文件,每个源文件可能定义一些不同的全局对象,那么,这些全局对象的构造顺序是无规律的。
千万不能在构造一个全局对象的时候(构造函数),使用另外一个全局对象,因为无法确定该对象是否已经构造出来。
如果确实需在一个全局对象的构造函数中使用另外一个全局对象,可以用全局函数来处理。

//全局函数
class ClassB;
ClassB& GetClassB()
{
    static ClassB b;    //如果c++11 多线程调用时,该行不安全,最好在主线程中进行调用该函数进行构造
    return b;
}

ClassA::ClassA()
{
    std::cout << "ClassB::m_i"<< GetClassB().m_i << std::endl;
}

另外也不要在一个全局对象的析构函数中调用其他全局对象,因为无法确定该对象是否已经析构。

函数中静态对象的构造顺序

函数中静态对象的构造顺序,就是第一次运行到该处时,进行构造。

类中静态对象的构造顺序

同一个编译单元(即同一个cpp),静态成员对象的构造顺序,跟定义的顺序有关,与声明顺序无关。

相关文章

  • C++ 编程技巧与规范(一)

    静态对象的探讨 类中静态成员变量 静态成员变量,需要先声明,然后再定义。如果没有使用到该静态成员变量,则可以不用定...

  • C++ 编程技巧与规范(五)

    不能被拷贝构造和拷贝赋值的类对象 delete 用delete这种方式,需要自己提供构造函数。 加入以上处理后,当...

  • C++ 编程技巧与规范(二)

    拷贝构造函数和拷贝复制运算符的书写 如下: 对象自我赋值产生的问题 对象的自我赋值,会产生一些问题,比如: A的赋...

  • C++ 编程技巧与规范(四)

    组合关系 has-a 关系 has-a 关系也称为 is-part-of关系。下面的定义了这种关系: 可以是说是 ...

  • C++ 编程技巧与规范(三)

    类的public继承(is-a关系)及代码编写规范 子类继承父类的方式有三种:public, protected,...

  • 极客班第一周学习笔记

    初识C++ C++是在C之上基于对象,面向对象的编程语言。c++相比c在编程上更加模块化,具象化。 C++代码规范...

  • C++面向对象高级编程(上)笔记

    1.培养规范、大气的编程习惯 C++的学习过程可以分为C++语言与C++标准库两个部分,不必太在乎版本。标准库一般...

  • C++ 编程规范

    C++ 编程规范 这是一本 由两位世界顶级专家联袂巨献,适合所有层次 C++程序员 的 C++ 界20年集大成之作...

  • C++ 编程规范

    组织 不要拘泥于小节 在高警告级别干净利落地进行编译 使用自动构建系统 适用版本控制系统 在代码审查上投入 设计 ...

  • C++编程规范

    序 C++用法很多,包容性也比较强。一个C++的工程可能包含了各种各样没见过的用法。本篇内容主要是参照谷歌C++标...

网友评论

      本文标题:C++ 编程技巧与规范(一)

      本文链接:https://www.haomeiwen.com/subject/pfsxiktx.html