Chapter 9 More on Classes and Objects
1. Constructors(构造函数) 函数名即类名,无返回值,为对象开辟存储空间时自动调用。可使用初始化器:PlayingCard (Suits is, int ir) : suitValue (is), rankValue (ir) { }
2. Default Constructor(缺省构造函数)无参数。
3. Destructor Declaration(析构函数)~ ClassName ( ) { … } 类名前面加~,无参数无返回值,不能被重载,对象的内存空间被释放时自动调用。
4.构造函数和析构函数调用顺序:类似栈的结构。
5.对象数组:ClassName ArrayName[ConstIntExpression];
using the default constructor
PlayingCard cardArray[52];
using constructor with parameters
PlayingCard cardArray[2]={ PlayingCard(PlayingCard::Heart,1), PlayingCard(PlayingCard::Club,2) };
6.对象指针:The pointer variable will hold the beginning addressof an object in memory space.
this是一个指针!
7.Only the initializercan be used to specify the initial value for const dada members.
8.成员函数也可以const:DataType FunctionName(Parameter List) const;
The const member function can access the data members in its class, but can not modify their values.
9.const对象:constClassName ObjectName[(Augument List)];//or ClassName const ObjectName [(Augument List)];
All the data members of a const object are const data members. Only the const member functionof a const object can be accessed.
10.指针变量也可const,指针指向的对象是谁不能改变,但可以改变对象的值。
11.引用也可const:DataType FunctionName(const ClassName & ReferenceName);但引用对象的值不能被改变。
12.栈区编译时分配内存,堆区运行时分配内存。
注意指针操作:ClassName *PointerName; PointerName=new ClassName;//or PointerName=new ClassName(Argument List); … delete PointerName;
13.浅拷贝与深拷贝:A shallow copy sharesinstance variables with the original. A deep copy creates new copies of the instance variables.
14.拷贝构造函数:ClassName:: ClassName(const ClassName & ObjectName) { … }注意const引用,要不然生成对象数组的时候会报错!
两种调用方式:ClassName ObjectName1; … ClassName ObjectName2(ObjectName1);//or ClassName ObjectName3=ObjectName1;
15.Static member has only one copy shared by all the instances(实例) of a class.
16.类声明中,静态成员变量仅完成了声明,并未定义和赋初始值,也不能在类内定义和赋初始值。
17.Static member functions are mainly used to access static data members.
18.调用静态成员函数:类名.函数名(参数列表)或类名::函数名(参数列表) 没有this指针。
19.友元可以是: external function member function of another class a whole class 友元可以从外部访问整个类的成员。friend关键字要加在最前面。
20.类模板:Box<int>iBox(7);
21.如果成员是const,引用,或者某种未提供默认构造函数的类类型,必须通过构造函数初始值列表初始化(C++ Primer p259)
Only the initializercan be used to specify the initial value for const dada members.
类似:
class PlayingCard { public: PlayingCard (Suits is, int ir) : suitValue (is), rankValue (ir) { } … private: Suits suitValue; int rankValue; };
22.当使用默认构造函数初始化对象:
Sales_data obj();//错误 声明了一个函数而非对象 Sales_data obj2;//正确 obj2是一个对象而非函数
23.访问类的静态成员:
double r; r=Account::rate(); Account ac1; Account *ac2=&ac1; r=ac1.rate(); r=ac2->rate();
24.静态成员可以作为默认实参。
25. delete p; p是指针。
26. 函数模板,类模板:
template<typename T> T foo(T *p) { T temp=*p; return temp; } int a=5; int *b=&a; int c=foo<int> (b); template<typename T, typename U> class Blob { ... } Blob<int,int> b;
typename可以换成class 没有影响。
27.析构函数:
public: ~Foo();//函数名与类名相同
28.
构造函数可以被重载,因为构造函数可以有多个且可以带参数。
析构函数不可以被重载,因为析构函数只能有一个,且不能带参数。
29.对象数组初始化:
PlayingCard cardArray[2]={ PlayingCard(PlayingCard::Heart,1), PlayingCard(PlayingCard::Club,2) };
30. new与delete:
ClassName *PointerName; PointerName=new ClassName;//or PointerName=new ClassName(Argument List); delete PointerName;
31.访问类的静态成员:
ObjectName . StaticDataMemberName
ClassName :: StaticDataMemberName
32.友元举例:
友元函数 (别忘加上 类名::)
class ClassName1{ DataType FunctionName(Parameter List); … } class ClassName2{ friendDataType ClassName1 ::FunctionName(Parameter List); … }
友元类
class ClassName2{ friend ClassName1; … }
33.类模板
template <class T> class Box { public: Box (Tinitial) : value(initial) { } T getValue( ) { return value; } void setValue (TnewValue); private: Tvalue; }; template <class T> void Box<T>:: setValue (TnewValue) { value = newValue; }
注意在实现成员函数时也要完整的加上template <class T> void Box<T>::
34.const成员函数(是指参数列表是const的?)
https://www.cnblogs.com/betaa/p/10577960.html
35.浅拷贝:share同一个instance
浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
36.静态成员函数不具体作用于某个对象,所以静态成员函数内部不能访问非静态成员变量,也不能调用非静态成员函数。