【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;
}



原文地址:https://www.cnblogs.com/ruan875417/p/4495575.html