- 类的定义和声明
(1)注意编程角色的不同类别:设计类的接口时,设计者应该考虑的是如何方便类的使用;使用类的时候,设计者就不应该考虑类如何工作。
(2)构造函数和析构函数都可以是私有的,但是这样的话便无法在类之外的地方显示的调用new和delete,因为new和delete会调用构造函数和析构函数。
(3)使用类型别名来简化类:定义自己的局部类型名字。如:
class Test
{
public:
//
typedef std::string::size_type index;
index Get();
};
inline Test::index Test::Get()
{
;
}
(4)显示指定inline成员函数:在类内部定义的成员函数(声明和实现在一起),将自动作为inline处理。也就是说,当它们被调用时,编译器将试图在同一行内扩展该函数。也可以显示的将成员函数声明为inline,此时声明和实现是否在一起没有要求:
class CCsene
{
....
public:
//默认内联
void SetA(){;}
//显式内联
inline void SetB();
void SetC(){...}
};
//必须放在头文件里,否则编译错误
//inline定义必须都放在头文件里
void CCsene::SetB()
{
;
}
inline void CCsene::SetC()
{
;
}
(5)尽可能使用前向声明//C.h
class A;
class C
{
;
}
//C.cpp
#include "C.h"
#include "A.h"
因为在类定义之后可以接一个对象定义列表:
class CTest{...};
class CTest{...} a,b;
(7)关于this指针:注意this指针来控制const效果
this指针由编译器隐含的定义,它作为成员函数的隐含形参使用。
在普通的非const成员函数中,this的类型是一个指向类类型的const指针(指针值为const,但是指针指向的内容不一定是const);
在const成员函数中,this的类型是一个指向const类类型对象的const指针。既不能改变this所指向的对象,也不能改变this指针值。
class A
{
public:
//const成员函数
void SetA() const;
}
(8)const重载 p378
基于成员函数是否为const,可以重载一个成员函数
class Test
{
public:
Test& Get()
{
return *this;
}
const Test& Get() const
{
return *this;
}
}
(9)可变数据成员
有时,我们希望类的数据成员(甚至在const成员函数内)可以修改,这可以通过将它们声明为mutable来实现。
mutable int noconst;
(10)static类成员
来源:有时需要一个全局对象,但全局对象破坏封装,这时可以定义一个类的静态数据成员,而不是定义一个可以普遍访问的全局对象。
特性:static数据成员独立于类的任意对象而存在;每个static数据成员是与类关联的对象,并不与该类的对象相关联。
静态成员函数:(a)没有this形参,它可以直接访问所属类的static成员。但不能直接使用非static成员,因为不属于某个对象。(b)同时因为如此,它不能是const函数。(c)static关键字出现在类定义内部,类外部实现无需重复指定static关键字。但是const必须都得出现,因为const可以重载。(d)不能声明为虚函数。