上一页 1 ··· 30 31 32 33 34 35 36 37 38 ··· 58 下一页
  2014年1月8日
摘要: 1、考虑为什么? 首先,#define不是语言的一部分,而是预编译过程。也就是在编译器编译之前,进行文本替换。考虑#define Pi 3.1425;在编译之前,Pi都会被文本替换为3.1415,因此编译器看不到Pi这个标识。这会增加调试难度。同时文本替换导致目标码中出现多份3.1415。2、尽量不使用#define,就要使用替代办法。3、对于#define Pi 3.1415这样形式,使用const替换const double Pi = 3011415;以const替换#define,有两个特殊情况: a、定义常量指针,使用两个const,限制指向对象不能修改,指向不能修改; b、cl... 阅读全文
posted @ 2014-01-08 19:45 Andy Niu 阅读(307) 评论(0) 推荐(0)
摘要: 1、C++是个多重范型编程语言:面向过程,面向对象,函数编程,泛型形式,元编程形式。2、C++是一个语言联邦,包括四个次语言: a、C语言,C++以C语言为基础。但C语言有下列局限:没有模版,没有异常,没有过载。 b、面向对象C++,包括继承,封装,多态,抽象。 c、Template C++,泛型编程,可以生成代码的代码。 d、STL,标准库容器,迭代器,算法,方法对象。 阅读全文
posted @ 2014-01-08 19:12 Andy Niu 阅读(278) 评论(0) 推荐(0)
摘要: 1、为什么要以对象管理资源,它解决什么问题? 考虑下面的需求,客户需要一个动态分配的资源。我提供一个工厂方法,返回一个指针,指向资源。那么问题来了,谁来释放资源呢?只有客户知道什么时候不再使用资源,因此,应该是客户负责释放资源。如果客户没有成功释放资源,造成资源泄漏,注意,这里泄漏的资源不光是一块内存,还可能包括这块内存保存的其他资源。把成功释放资源的希望,寄托在客户身上,显然是不靠谱的。因为:a、客户可能忘记delete;b、代码异常,导致没有执行到delete。2、它是如何解决这个问题的? 我们知道,栈上分配的对象有个特点,超出作用域,不管什么情况,都会自动调用析构方法。因此,可以把堆.. 阅读全文
posted @ 2014-01-08 19:04 Andy Niu 阅读(243) 评论(0) 推荐(0)
摘要: 1、变量三要素:类型,名称,值。定义变量的时候,提供初始值,定义时指定了初始值的对象称为已初始化的。C++支持两种初始化形式:直接初始化,赋值初始化。如下: int ival(1024); // 直接初始化 int ival = 1024; // 赋值初始化2、初始化与赋值是两个概念。初始化:创建对象时赋给初始值。赋值:擦除对象的当前值,并用新值代替。因此,判断是初始化还是赋值的关键是,看看对象当前是否已经存在值了。3、初始化调用copy构造方法,赋值调用copy复制操作符。 阅读全文
posted @ 2014-01-08 18:28 Andy Niu 阅读(512) 评论(0) 推荐(0)
  2014年1月7日
摘要: 1、定义变量的时候,如果没有初始化,它的值是什么呢? 它的值取决于变量的类型和变量定义的位置。2、考虑基本类型的变量,定义时没有初始化。如果定义在方法外部,初始化为0,如果定义在方法内部,不被初始化。使用未初始化的变量,导致未定义行为。未初始化的变量事实上,也有一个值,这个值是随机的。因此强烈建议,基本类型的变量都要初始化,也就是方法内部的变量。3、考虑类类型的变量,定义时没有初始化。不管定义在哪里,都会调用默认构造方法,这种情况下,必须提供默认构造方法,如果没有,编译出错。也就是说,对于类类型的变量,不存在没有初始化的情况,因为没有显式初始化,会调用默认构造方法进行隐式初始化。 阅读全文
posted @ 2014-01-07 20:32 Andy Niu 阅读(1055) 评论(0) 推荐(0)
摘要: 1、继承关系可认为,子类在父类的基础上进行。从这个角度讲,可把它认为穿衣脱衣的过程。穿衣是:先穿内衣,再穿外套。脱衣是:先脱外套,在脱内衣。构造是:先调用父类构造方法,再调用子类构造方法。析构是:先调用子类析构方法,再调用父类析构方法。2、构造可分为两个步骤:初始化列表和方法内赋值。前者的使用场景是:初始化,即copy构造。后者的使用场景是:赋值,即copy赋值。 a、对于类类型,如果没有在初始化列表中显式初始化,会进行隐式初始化,调用默认构造方法。因此,没有默认构造方法的类成员,必须显式初始化。 b、对于基本类型,如果没有在初始化列表中显式初始化,不会进行隐式初始化。初始值依赖于对象的作.. 阅读全文
posted @ 2014-01-07 19:49 Andy Niu 阅读(446) 评论(0) 推荐(0)
摘要: 1、首先理解需求,被调用方法修改了形参,如果期望在主调方法中的实参也发生变化,必须使用pass-by-reference。因为C++缺省情况下(继承C方式),以by-value传递对象,在被调方法中修改的是实参的副本。2、在被调方法中,必须修改形参,但是期望主调方法中的实参不发生变化,这种情况下,必须使用pass-by-value。3、在被调方法中,不修改形参。应该使用pass-by-reference-to-const替换pass-by-value(有例外情况)。为什么? a、因为pass-by-value的成本大。要创建新对象,调用构造方法和析构方法。主要有:父类构造方法-->父类字 阅读全文
posted @ 2014-01-07 18:57 Andy Niu 阅读(308) 评论(0) 推荐(0)
  2014年1月4日
摘要: 1、身体不健康,家庭不幸福,挣再多的钱,又有什么意义呢?2、人生需要大智慧,不要贪图小便宜,因小失大。3、不要老想着挣钱,把自身的素质和能力提高,自然而然,就能挣到钱了。4、中国人很聪明,解决眼前麻烦的能力很强,而没有长远的眼光,缺乏系统的考虑。5、人不要自以为很聪明,以为别人不会知道。很偏僻的道路,遇到红色信号机,没有摄像头,自以为很聪明的人,就闯红灯了。有一定信仰的人,坚决不闯红灯。表面上看,后者吃亏了,从长远来看,后者没有。因为后者减少了出事故的情况。6、不要别人对我不好,我就对别人不好,狗咬我,但是我不会咬狗。长远来看,我是不会吃亏的。 阅读全文
posted @ 2014-01-04 21:17 Andy Niu 阅读(305) 评论(0) 推荐(0)
  2014年1月3日
摘要: 1、多种继承,首先带来一个问题。那就是子类会从多个父类中继承相同的名称。这样,在调用的时候,必然导致歧义。2、考虑Base1中有个public方法XXX,Base2中有个private方法XXX,Derived继承Base1和Base2,那么分析一下,Derived d; d.XXX()到底调用哪个方法? 你可能会想,虽然两个都匹配,但是只有Base1的XXX方法可访问,因此调用Base1的XXX方法。这种想法是错的,编译报错:对XXX的访问不明确。为什么? 因为编译器决议调用哪个方法的时候,第一步,先把所有匹配的名称都拿来,不管是不是可以访问,然后在里面找到一个最优匹配,如果两个匹配程度.. 阅读全文
posted @ 2014-01-03 21:18 Andy Niu 阅读(432) 评论(0) 推荐(0)
摘要: 在编程中,不要别人一提需求,自己不思考,就埋头去干。应该想一想,他的真实意图,他为什么提这个需求?这个需求解决什么问题。有个经典的案例,客户提出想要一个月亮,愚蠢的人就开始想办法去实现,聪明的人会问客户,你要月亮干什么?用户说我想要照明。那直接给他一个灯泡就行了。 阅读全文
posted @ 2014-01-03 19:43 Andy Niu 阅读(993) 评论(0) 推荐(0)
上一页 1 ··· 30 31 32 33 34 35 36 37 38 ··· 58 下一页