Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4919908
  • 博文数量: 1168
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 14048
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
  • 认证徽章:
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1168)

文章存档

2019年(143)

2018年(81)

2017年(80)

2016年(70)

2015年(52)

2014年(41)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(288)

分类: Windows平台

2019-06-27 14:47:22


点击(此处)折叠或打开

  1. class A
  2. {
  3.   A(void); //无参数构造函数
  4.   A(const A& other); //拷贝构造函数
  5.   A& operate=(const A& other); //复制函数
  6. };

  7. class B
  8. {
  9.   public:
  10.     B(const A& a); // B的构造函数
  11.   private:
  12.     A m_a; //成员对象
  13. }

  14. 实现部分: 建议非C++内置数据类型的成员对象 采用初始化列表方式进行初始化, 以获得更高效率.

  15. B::B(const A& a)
  16.     : m_a(a) //成员对象在初始化列表中被初始化
  17. {
  18. ...
  19. }

  20. B::B(const A& a) //成员对象在函数体内被初始化
  21. {
  22.   m_a = a;
  23. }

类成员对象初始化次序只由成员对象在类中声明的次序决定, 完全不受在初始化表中的次序影响.

基类(非接口类)的析构函数必须为虚析构函数. 

类中如果含有指针成员对象, 并且对象经常拷贝. 则必须实现拷贝构造函数和赋值函数. 类定义是编译器会自动生成默认缺省拷贝构造函数和缺省赋值函数

拷贝构造函数是在对象被创建是调用的. 而赋值函数只能被已经存在了的对象所调用.
CString c = a; 或者 CString c(a); //隐式调用拷贝构造函数
c = b; //调用赋值函数

点击(此处)折叠或打开

  1. class CString
  2. {
  3.   public:
  4.     CString(const char* str = NULL); //普通构造函数
  5.     ~ CString(void); //析构函数

  6.     CString(const CString& other)  拷贝构造函数
  7.     {
  8.       if (NULL == other.m_pszData)
  9.       {
  10.         m_pszData = NULL;
  11.       }
  12.       else
  13.       {
  14.         int nLen = strlen(other.m_pszData);
  15.         m_pszData = new char[nLen+1];
  16.         strncpy(m_pszData, other.m_pszData, nLen);
  17.       }
  18.     }
  19.     
  20.     CString& operate =(const CString& other)  赋值函数
  21.     {
  22.       if (&other == this)
  23.         return *this;

  24.       delete[] m_pszData;
  25.       if (NULL == other.m_pszData)
  26.       {
  27.         m_pszData = NULL;
  28.       }
  29.       else
  30.       {
  31.         strncpy(m_pszData, other.m_pszData, nLen);
  32.         return *this;
  33.       }
  34.     }
  35.   
  36.   private:
  37.     char* m_pszData; //用于保存字符串
  38. };

  39. 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 类型的值域相同, 类型检查限制过于宽松.

阅读(98) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册