上一页 1 ··· 28 29 30 31 32 33 34 35 36 ··· 58 下一页
  2014年1月16日
摘要: 1、C++构造和析构的过程,类似于穿衣脱衣的过程。穿衣是:先穿内衣,再穿外套。脱衣是:先脱外套,再脱内衣。C++构造过程:首先调用父类构造方法,再调用子类构造方法。C++析构过程:首先调用子类析构方法,再调用父类析构方法。2、子类不能继承父类的构造方法和析构方法,除此之外,其他的成员都能继承,包括父类的private成员,只不过子类不能访问private成员。3、思考一下,为什么子类不能继承父类的构造方法? 想一想,构造方法是干什么的?构造方法是初始化对象的成分,创建对象。从语义上讲,父类构造方法初始化父类成分,构造父类对象。子类构造方法在父类对象的基础上,初始化子类专有成分,构造子类对象。. 阅读全文
posted @ 2014-01-16 19:12 Andy Niu 阅读(4050) 评论(0) 推荐(1) 编辑
  2014年1月15日
摘要: 1、Lazy解决什么问题? 考虑下面的需求,有个对象很大,创建耗时,并且要在托管堆上分配一大块空间。我们当然希望,用到它的时候再去创建。也就是延迟加载,等到真正需要它的时候,才去加载。考虑一下,我该怎么解决这个问题。2、显然,这里需要加一个中间层,将大对象封装起来,暴露接口,开始并不创建大对象,等到用户真正访问对象的时候,再去创建。另外,这个中间层应该可以封装不同类型的大对象,因此需要类模版。Lazy就是为了解决这个问题。 阅读全文
posted @ 2014-01-15 20:46 Andy Niu 阅读(2824) 评论(0) 推荐(1) 编辑
摘要: 1、有些情况下,我们不希望对象被拷贝,比如独一无二的对象,拷贝是没有意义的。这种情况下,我们应该禁止拷贝。也就是不提供copy构造和copy赋值,可问题是,如果我们不提供,编译器会自动生成。那该怎么办?2、我们声明copy构造和copy赋值为private,这就明确告诉了编译器,我已经声明了,你别为我生成了。由于copy构造和copy赋值是private,就禁止了外部的拷贝操作。 但仔细想,还是有问题,因为类的成员方法,友元方法,友元类还是可以访问private权限的copy构造和copy赋值,那该怎么办? 只声明,不定义。这样,就导致编译器连接的时候出错。有没有更好的办法呢?也就是说,将.. 阅读全文
posted @ 2014-01-15 20:19 Andy Niu 阅读(467) 评论(0) 推荐(0) 编辑
摘要: 1、如果没有声明copy构造方法,copy赋值操作符,和析构方法,编译器会自动生成这些方法,且是inline。2、如果没有声明任何构造方法,编译器会自动生成一个default构造方法,且是inline。3、编译器总是为我们生成一个合成析构方法。4、首先考虑,编译器生成的copy构造方法做什么事? copy构造方法是一个特殊的构造方法,形参是const T&。编译器生成的copy构造方法逐个成员初始化。逐个成员初始化:对于创建对象的每个non-static字段,使用现有对象的字段去初始化。 如果字段是类类型,递归调用类的copy构造方法。如果是内置类型,逐个bit拷贝。需要注意的是:对于 阅读全文
posted @ 2014-01-15 19:49 Andy Niu 阅读(372) 评论(0) 推荐(0) 编辑
  2014年1月14日
摘要: 1、Attribute与Property Attribute是特性,Property是属性。2、Attribute与注释 注释:是给程序员看的,编译的时候会去掉这些信息,也就是说,程序集中没有注释的内容。 Attribute:会被编译到程序集中,在程序集的元数据中,在加载程序集的时候,可以从它的元数据中提取出这些信息。3、说了那么多,考虑下,它解决什么问题? 考虑下面的需求,一个工具类提供了很多静态方法,甲乙两个程序员合作完成,理所当然,应该标识出哪些是甲写的,哪些是乙写的,用于统计。最笨的加注释,但是它有两个问题:a、编译后生成的程序集中,没有了这些注释内容;b、只能通过人工去统计甲... 阅读全文
posted @ 2014-01-14 20:46 Andy Niu 阅读(2203) 评论(0) 推荐(2) 编辑
摘要: 1、它解决什么问题? 考虑下面的需求,甲程序员对外暴露接口,内部提供实现。乙程序员使用甲提供的接口,根据面向接口编程的原则,乙关联一个接口类型的引用。正常情况下,乙要使用甲的实现,必须实例化一个具体对象。有没有更好的办法呢?我们知道Java框架spring中有个依赖注入的概念。C#中能不能使用类似的方式呢?2、怎么解决? 使用MEF(Managed Extensibility Framework),示例如下: 1 namespace TestMEF 2 { 3 public interface IBookService 4 { 5 void GetBookN... 阅读全文
posted @ 2014-01-14 20:16 Andy Niu 阅读(469) 评论(0) 推荐(0) 编辑
摘要: 1、它们解决什么问题? 考虑下面的需求,Person类有个字段age。我想使用Person p = (Person) 18 来创建一个age为18的Person对象,怎么办? 更进一步,我想使用Person p = 18 来创建一个age为18的Person对象,怎么办?2、使用explicit(显式)和implicit(隐式) 1 class Person 2 { 3 private int age; 4 public int Age 5 { 6 get { return age; } 7 ... 阅读全文
posted @ 2014-01-14 19:55 Andy Niu 阅读(2889) 评论(0) 推荐(2) 编辑
摘要: 1、首先区分初始化和赋值。 初始化:创建对象时赋给初始值。赋值:擦除对象当前值,并用新值代替。因此,区分初始化和赋值的关键是,看看对象当前是否已经有值了。2、创建对象的时候,如果没有初始化,对象的值是什么? 取决于对象的类型和对象定义的位置。 a、如果对象是内置类型,定义在方法外,它的值为0,定义在方法内,没有初始化。 b、如果对象是类类型,无论定义在哪里,都会调用默认构造方法,也就是说,对于类类型的对象,不存在没有初始化的情况。3、现在考虑,类中的数据成员,也就是字段。类的构造方法执行两个过程:成员初始化列表和方法内赋值。对于类类型,前者用于初始化,即copy构造;后者用于赋值,即c... 阅读全文
posted @ 2014-01-14 19:28 Andy Niu 阅读(571) 评论(0) 推荐(0) 编辑
  2014年1月13日
摘要: 1、为什么搞出const关键字? const指定一个语义约束,指定一个对象不可修改。如果一个对象不可修改,就应该说出来。2、const与指针 const可以修饰指向之物,也可以修改指针本身。STL中的迭代器是对指针的封装,因此,迭代器也有两个概念:指向常量对象的迭代器和常量迭代器。 vector::const_iterator; //指向常量的迭代器 const vector::iterator; // 常量迭代器3、const可以与方法产生关联,可以用在方法前,方法中(形参表中),方法后。首先考虑,用在方法前,表示返回值是常量。为什么要返回const对象呢? 我们知道,方法返回值是... 阅读全文
posted @ 2014-01-13 20:43 Andy Niu 阅读(351) 评论(0) 推荐(0) 编辑
  2014年1月12日
摘要: 1、使用new动态分配内存,必须承担如下责任: a、使用delete释放内存; b、确保使用了正确的形式,delete与new的形式要匹配; c、不能重复delete。2、使用vector和string可以消除以上的负担。每当要动态分配一个数组时,都要考虑使用vector和string替代。如果元素是字符char,使用string。否则使用vector。注意:有一种特殊情况,使用vector更合理。3、vector和string的元素分配在堆上,它们内部维护一个指针,指向堆上的元素。vector和string是深拷贝,会把元素逐个拷贝。4、vector和string,它们自己管理内... 阅读全文
posted @ 2014-01-12 22:33 Andy Niu 阅读(479) 评论(0) 推荐(0) 编辑
上一页 1 ··· 28 29 30 31 32 33 34 35 36 ··· 58 下一页