C++思考笔记-----Ruminations on C++ 之 类的设计

        最近,在用一些零碎时间,看Ruminations on C++这本书.

        觉的应该把自己觉的有价值的东西写下来..其实,之前看c++ primer和Thinking in c++的时候.就想过这种方法.但一直没有实施,导致很多知识都只是在脑中一过,,用的时候,大部分都忘了,还得去翻书,

        希望这种方法能让自己记忆的更深一点,,将来即使忘了,也可以很方便的回过头来复习一下下..

 

        希望这种方法能给我带来理想的效果,看到这篇文章的朋友,同行,也可以用一下..有什么好的方法,也可以一起分享一下....

 

-----------------------------------------------------------------------------------------------------------------------------------------------------

 

书上有这么两句话,我觉的说的很有道理:

                   只为用到的东西付出代价

                   C++更适合于那些喜欢思考的程序员

 

当然,并不是说别的语言就不好,我就挺C++,完全没有这个意思,,我觉的做这种比较或是辩论是豪无意义的,每一种语言都有自己的存在价值,和强势,,在你需要的时候用正确的语言.

 

-----------------------------------------------------------------------------------------------------------------------------------------------------

 

今天,主要研究了一下设计一个类应该考虑到的问题

 

                                 第4章  类设计者的核查表

 

#你的类需要一个构造函数吗?

1>,不,我的类很简单,我的类里定义的是我用到的接口,

2>必须有,我需要构造函数来隐藏类内部的构造方式

 

#你的数据成员是私有的吗?

1>设计一个类,很有必要把它的数据成员设计成私有的,这是C++非常鼓励的,如果需要访问,要用接口来代替公有成员

 

#你的类需要一个无参的构造函数吗?

1>当你显示声明了一个拷贝构造函数时,一个无参的构造函数通常是必须的,即使你的类并不需要这种功能,因为类的使用都并不知道.

 

#是不是每个构造函数初始化所有的数据成员?

1>这通常是必须的(即使有可能不必这样做),也是一个很好的习惯,能让你避免许多,一开始没有考虑到的问题

 

#类需要析构函数吗?

1>当你的类包含有指针成员变量时,一个构造函数是必须的,你需要在里面对你的动态内存进行回收,当养成这个习惯是,你将不会再为内存泄漏面烦恼,这往往比其实一些语言的垃圾回收机制更加好用.

 

#类需要一个虚析构函数吗?

1>当你的程序中用到父类的指针去引用子类的对象的时候,(一个好的程序架构中,这种用法是随处可见的)在父类中,这个虚析构函数是不可缺少的.

 

#你的类需要拷贝构造函数(赋值=操作符)吗?

1>            class String {

                public:

                          String();

                          String(const char *s);

                private:

                          char *data;

                };

很明显,类的成员变量是指针类型,而默认的拷贝(赋值)只是浅拷贝(结果就是两个类中的data指向了同一块内存,这是很危险的),而我们这里需要的是深拷贝,这里解决方法有两种,一种是定义一个深拷贝,如果就是不想让类的使用者去复制对象话,可以把拷贝(赋值)定义为私有的.

                class String {

                public:

                          String();

                          String(const char *s);

                          String(String str){

                                  this.data=new char[sizeof(*str.getData())];

                                  *this.data=*str.getData();

                          }

                          char * const getData(){

                                  return data;

                          }

                private:

                          char *data;

                };

 

#你的类需要定义关系操作符吗?

1>如果你的类用到模板,或是自己定义的数据结构,关系操作符是必须的...

 

#删除数组时你记住了用 delete[]吗?

1>在删除任何类型的数组时,记得用delete[]...

 

#类中应该使用const吗?/

1>原则是能加上const的地方都要加上,即使你看上去可能没有任何好处..这加强了你类的安全性的封闭性.是很必要的.

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------

 

       其中,有几条我觉的可以归纳到一起,我就放到一起了...这些都是平时常用,而且容易被忽略的.大部分C++程序漏洞都是这样造成的.如果能做到这些点.我想C++是最安全的..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值