Loading

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.静态成员函数不具体作用于某个对象,所以静态成员函数内部不能访问非静态成员变量,也不能调用非静态成员函数。

posted @ 2020-04-23 19:23  脂环  阅读(39)  评论(0编辑  收藏  举报