【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;
}
posted on 2015-03-23 21:17 ruan875417 阅读(131) 评论(0) 收藏 举报
浙公网安备 33010602011771号