zoukankan      html  css  js  c++  java
  • 【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;
    }
    

    

  • 相关阅读:
    Preserving Remote IP/Host while proxying
    使用EF Core生成实体类 用来作为NetCore数据库访问上下文 Context
    【ASP.NET Core快速入门】(八)Middleware管道介绍、自己动手构建RequestDelegate管道
    NetCore WebApi 基于Jwt的验证授权方式
    Net Core 页面的生命周期 + OnActionExecuting
    C# 多线程发送邮件 代码版
    ASP.NET Core 中的过滤器(Action过滤器,控制器过滤器,全局应用程序过滤器)
    深入理解 NetCore 中的依赖注入的好处 及 、Singleton、Scoped、Transient 三种对象的差异
    巧用 display: contents 增强页面语义
    巧妙实现带圆角的渐变边框
  • 原文地址:https://www.cnblogs.com/ruan875417/p/4495575.html
Copyright © 2011-2022 走看看