-
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 类型的值域相同, 类型检查限制过于宽松.
阅读(1415) | 评论(0) | 转发(0) |