zoukankan      html  css  js  c++  java
  • C++ Tips

    {} 与 ()初始化变量

    下面两种方式都把foobar初始化了10和100

        //圆括号初始化
        int foo(10);
        int bar(100);
    
        //花括号初始化
        int foo{10};
        int bar{100};
        
    

    他们的区别在于花括号是C++11新引入的初始化方式,成为列表初始化 (list initialization),他们有一个区别:

        long double ID = 3.1415926;
        int foo{ID};//会报错,long double -> int会导致信息丢失
        int bar(ID);//虽然也会导致信息丢失,但圆括号允许这样的转换
    

    所以用花括号来说比较有限制性,很安全。

    struct 和 class的区别

    一般定义类可以用classstruct两种关键字来定义,二者仅仅是形式上的区别,唯一的不同之处在于成员的默认访问权限不一样:

    //class关键字定义类
    class TEST_1 {
        int foo;//foo的访问权限是public
    public:
        int a,b;
    };
    
    //struct关键字定义类
    struct TEST_2 {
        int foo;//foo的访问权限是private
    public:
        int a,b;
    };
    

    就像上面注释所说,如果使用class关键字定义类,那么在这个类中定义在第一个访问说明符之前的成员是private,相反,struct定义的类中定义在第一个访问说明符之前的成员默认是private的。(访问说明符:publicprivate)。

    类的const成员函数

    const Sales_Data& displayName() const;
    

    类似于上面这种类的成员函数后跟const关键字的成员函数就是const成员函数。我们知道在调用成员函数时,会把当前对象的地址作为隐形的参数this传递进去。this是常量指针,也就是* const的,它的值不允许改变,但它指向的值可以不是常量。这就引发了一个问题:当类的一个实例被声明成了const,这个实例是无法调用一般的成员函数的,因为this* const而不是const * const。如果确实有必要,这时候就应该在一般函数的声明及定义结尾加上const,这样在const实例在调用该函数时this会被转换成const * const,第一个const就是结尾加的那个const。这时候这个成员函数就可以作用这个常量实例了。我们举个栗子:

    class Foo {
    public:
        int bar = 100;
        Foo() = default;
        Foo(int bar_) : bar(bar_){};
        void display_bar(){
            std::cout << bar;
        }
    };
    
    int main() {
        Foo a;
        a.display_bar();
    
        return 0;
    }
    

    在这个栗子中,display_bar成员函数打印出Foo类的bar值,没有对原对象作出任何改变。a的调用是没有任何问题的,但是bconst的,调用就立马出现了问题:

    'this' argument to member function 'display_bar' has type 'const Foo', but function is not marked const
    一旦编译运行就会报错:
    passing 'const Foo' as 'this' argument discards qualifiers
    所以为了使这个函数既适用于const对象以及非const对象,我们在加上const就不会出错了。

    class Foo {
    public:
        int bar = 100;
        Foo() = default;
        Foo(int bar_) : bar(bar_){};
        void display_bar() const{
            std::cout << bar;
        }
    };
    
    int main() {
        Foo a;
        a.display_bar();
    
        return 0;
    }
    

    incomplete类

    类在没有定义之前,是一个不完全类型(incomplete type),所以一个类的成员不应该包含其自身类型。但是,类的成员可以包含其自身的指针或指针。

    class Foo {
    	int a = 100;
        //错,不允许类成员出现其本身类型
        //Foo b;
        Foo *b;//可以
    }
    
    世事茫茫,光阴何其有限!
  • 相关阅读:
    管理者的四种不同授权风格
    centos7 未启用swap导致内存使用率过高。
    Dynamically create a div element with JavaScript/jQuery
    sql server: Parent/Child hierarchy tree view
    视频编解码系列(一)压缩编码基础常识
    mac 常用终端命令
    Linux下安装Python3.6.8
    SQL特殊字符转义
    Ehcache缓存监控
    指标管理体系设计
  • 原文地址:https://www.cnblogs.com/bobliao/p/10049762.html
Copyright © 2011-2022 走看看