• 【c++ primer读书笔记】【第7章】类


    1、成员函数的声明必须在类的内部,它的定义既可以在类的内部也可以在类的外部,定义在类内部的函数是隐式的inline函数。

    class A{
    public:
        int getNum(){ return num; } //隐式inline函数
    private:
        int num;
    };
    

    2、成员函数通过this的隐式参数来访问调用它的那个对象。默认情况下,this的类型是指向类类型非常量版本的常量指针,因此我们不能把this绑定到一个常量对象上。

    3、在成员函数参数列表后加上const关键字表示this是一个指向常量的指针,这样的成员函数称作常量成员函数。

    class A{
    public:
        int getNum() const { return num; } //常量成员函数
    private:
        int num;
    };
    

    4、构造函数用来初始化类对象的数据成员。c++新标准中,在参数列表后面加上=default要求编译器生成构造函数。

    5、struct关键字,在定义第一个访问说明符之前的成员是public的;用class关键字,在定义第一个访问说明符之前的成员是private的。

    6、一个可变数据成员永远不是const,即使它是const对象的成员。

    class A{
    public:
        A():num(0){}
        int getNum() const { return num; }
        void changeNum() const { ++num; } //是const对象的成员,但可修改
    private:
        mutable int num; //可变数据成员
    };
    

    7、前向声明:仅声明类而暂时不定义它;在类声明之后定义之前是不完全类型,此时编译器知道是一个类,但不知道包含哪些成员。

    8、友元关系不存在传递性。

    9、成员初始化顺序与它们在类定义中的出现顺序一致,而与构造函数初始值列表中初始值的前后关系无关。

    #include<iostream>
    using namespace std;
    
    class A{
    public:
        A(int val):j(val),i(j){} //未定义的,i在j之前被初始化
        void print(){
    	cout<<"i:"<<i<<endl;
    	cout<<"j:"<<j<<endl;
        }
    private:
        int i;
        int j;
    };
    
    int main(){
        A a(5);
        a.print();
    	
        system("pause");
        return 0;
    }
    

    在我电脑上运行结果:

    10、C++新标准可以定义委托构造函数,即用它所属类的其他构造函数执行它自己的初始化过程。

    class A{
    public:
        A(int val):i(val),j(i){}
        A():A(0){}  //委托构造函数,在VS2013中支持
        void print(){
    	cout<<"i:"<<i<<endl;
    	cout<<"j:"<<j<<endl;
        }
    private:
        int i;
        int j;
    };
    

    11、隐式的类类型转换:编译器只会自动执行一步类型转换。explicit关键字阻止类类型的隐式转换,只对一个实参的构造函数有效,只能以直接初始化的形式使用。只能在类内声明构造函数时使用explicit关键字,在类外部定义时不应重复。

    #include<iostream>
    #include<string>
    using namespace std;
    
    class A{
    public:
        explicit A(string& s):str(s){} //阻止隐式转换
    private:
        string str;
    };
    int main(){
        A a("aaa");  //错误
        A b(string("aaa")); //正确,实参是一个显式构造的string对象
        A c(static_cast<string>("aaa")); //正确,实参用static_cast执行了显式的转换
    	
        system("pause");
        return 0;
    }
    

    

  • 相关阅读:
    解决span中的内容不换行
    javascript中apply、call和bind的区别
    vuex及其属性应用
    55.动态加载Html
    58.圆角图片
    57.动态添加子View(Java/XML两种方式)
    56.Java与js交互
    59.仿微信的图片浏览器
    64.判断当前线程是否是主线程
    61.自定义Indicator
  • 原文地址:https://www.cnblogs.com/ruan875417/p/4495575.html
Copyright © 2020-2023  润新知