点击(此处)折叠或打开
- class A
- {
- A(void); //无参数构造函数
- A(const A& other); //拷贝构造函数
- A& operate=(const A& other); //复制函数
- };
- class B
- {
- public:
- B(const A& a); // B的构造函数
- private:
- A m_a; //成员对象
- }
- 实现部分: 建议非C++内置数据类型的成员对象 采用初始化列表方式进行初始化, 以获得更高效率.
- B::B(const A& a)
- : m_a(a) //成员对象在初始化列表中被初始化.
- {
- ...
- }
- B::B(const A& a) //成员对象在函数体内被初始化
- {
- m_a = a;
- }
类成员对象初始化次序只由成员对象在类中声明的次序决定, 完全不受在初始化表中的次序影响.
基类(非接口类)的析构函数必须为虚析构函数.
类中如果含有指针成员对象, 并且对象经常拷贝. 则必须实现拷贝构造函数和赋值函数. 类定义是编译器会自动生成默认缺省拷贝构造函数和缺省赋值函数.
拷贝构造函数是在对象被创建是调用的. 而赋值函数只能被已经存在了的对象所调用.
CString c = a; 或者 CString c(a); //隐式调用拷贝构造函数
c = b; //调用赋值函数
点击(此处)折叠或打开
- class CString
- {
- public:
- CString(const char* str = NULL); //普通构造函数
- ~ CString(void); //析构函数
- CString(const CString& other) 拷贝构造函数
- {
- if (NULL == other.m_pszData)
- {
- m_pszData = NULL;
- }
- else
- {
- int nLen = strlen(other.m_pszData);
- m_pszData = new char[nLen+1];
- strncpy(m_pszData, other.m_pszData, nLen);
- }
- }
-
- CString& operate =(const CString& other) 赋值函数
- {
- if (&other == this)
- return *this;
- delete[] m_pszData;
- if (NULL == other.m_pszData)
- {
- m_pszData = NULL;
- }
- else
- {
- strncpy(m_pszData, other.m_pszData, nLen);
- return *this;
- }
- }
-
- private:
- char* m_pszData; //用于保存字符串
- };
- CString a, b
拷贝构造函数和赋值函数 若无法确定的是否应该存在, 则将其声明为protected. 那么再有意外的赋值操作时, 编译器会报错.
原则上, 当成员变量不对外暴露, 应声明为 private
类成员变量必须在类的构造函数中被初始化
类的指针成员变量必须在类的析构函数中释放, 并且使用 SAFE_DELETE 或者 SAFE_RELEASE 宏.
自定义成员变量尽量使用指针变量或者引用变量, 不要使用对象, 因为使用自定义类型对象,会因交叉编译导致编译速度变慢.
类的成员函数使用, 必须显式的使用 this 指针
对外暴露的成员函数声明为 public, 不对外的为 protected/private
优先使用C++标准模板库的内置数据类型/容器
std::string
std::vector
std::list
std::deque
std::queue
std::stack
std::set
std::map
std::multi_map
std::hash_map
std::pair
布尔类型尽量使用 bool, 而不是 BOOL. 因为 bool的值域为 true/false, 具有很强的类型检查限制, BOOL对应值域与 long 类型的值域相同, 类型检查限制过于宽松.