第三部分:类和数据抽象 1.抽象数据类型是面向对象编程和泛型编程的基础。
第12章:类。
1.在类型定义的函数默认是inline函数。
2.int abc() const; const成员函数不能改变其做操作的对象的数据成员,const必须同时出现在声明和定义中。 而static 只能声明在头文件中,而非实现文件中(省略)。
3.public,private的访问标号可以出现的次数通常是没有限制的。
4.私有数据通过公有方法来访问和设置,这样体现了封装,并且日后要修改需求,则无须改变用户级代码了。只要在方法中增加限时和检查即可。
5.除了定义数据和函数成员之外,类还可以定义自己的局部类型名字。 public : typedef std::string::size_type index;
6.声明一个类:class Cwj; 称为:向前声明,约束,声明了不代表就能使用这个类了,我们只能使用其指针和引用东东。
7.为什么类必须要;结束呢,因为c++的类和struct一样,也可以在{}后面定义多个对象;例如:class Cwj{} c1,c2; 所以必须以;结束。
8.const函数的this是一个指向const 对象的 const指针,所以不能够改变。 const函数之所以不能改变数据成员,是因为他内置的this指针是const。mutable表示可以改变。呵呵
9.成员函数中具有屏蔽效果:是因为查找的先后顺序,先局部--》在类域--》然后再全局区域中找。 我们可以使用::来限定域。
10.构造函数初始化列表是许多相当有经验的c++程序员都没有掌握的一个特性。
11.必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化。
2.每个成员在构造函数初始化列表中只能指定一次。初始化次序与定义成员的次序一样,而非代码的先后顺序。如果一个成员根据另一个成员初始化,那么必须先初始化那个成员。
3.建议使用默认实参,因为他减少代码重复。一般设置为空。
4.单个参数的构造函数会做隐式的类类型的转换。explicit 明确表面这个构造函数不能通过隐士转换,必须是原有的类型。
5.友元,拓展了类的作用域范围哦。
6.const 函数和static函数,并不是缩小了,而是扩大了其使用范围。const对象,类名直接使用。 static函数没有this指针。
第13章:复制控制。
1.具有指针成员时,基本上该写的都应该自己写罗。= 拷贝构造 析构delete 构造new
2.默认的拷贝构造函数是:逐个为每个非static元素进行赋值。
3.拷贝构造函数必须使用引用的原因是:避免无穷拷贝。导致无穷递归罗。
4.为了防止复制,类必须显示声明其复制构造函数为private. 不给给予实现和定义。
5.默认的析构函数不会被覆盖,他会默默的析构掉其他成员空间。我们定义的析构也会执行,然后还会执行默认析构。
6.要注意对象赋值给自己这个问题哦。我们通过指针的==来可以判断他们是不是同一个对象哦。
管理指针成员:防止悬垂指针。
1.实现深拷贝:对象是独立的,每人一份。
2.智能指针: 对象是共享的,多人共用一份。即一个智能指针类将一个计数器与类指向的的对象相关联,计数器跟踪多少个共享对象,计数器为0时才delete空间。
class U_Ptr{
friend class HasPtr;
int *p;
size_t use;
U_Ptr(int *p):p(p),use(1){}
~U_Ptr(){ delete p; }
};
3.什么是使用计数?
是复制控制成员中使用的编程技术。将一个计数器与类指向的对象相关联,用于跟踪该类有多少个对象共享同一个指针。复制构造和赋值的时候要+1,要赋值左边的东东要减一,如果计数器为0,那么就delete该对象。
4.智能指针需要通过复制控制来控制成员,管理指向对象的共享。
第14章:重载操作符与转换。
1.重载操作符必须具有至少一个类类型或枚举类型,这样就规定了不能重新定义内置类型对象的操作符。必须要有类或枚举才可以。
2.操作符定义为非函数成员时,必须设置为操作类的友元。friend std::ostream& operator<<(std::ostream& , const int a);
3.如果重新定义|| && , 则会失去短路运算的特征。 重载>>输入操作符必须考虑处理错误和文件结束的可能性:clear() 清除状态。重载+最好要返回右值,而非引用。与原意保持一致最好。同理,赋值最好返回引用。自增和自减,返回的也是引用。 而且后缀需要提供一个int参数。以示区分:后缀则需要返回值,而非引用哦。obj.operator++(0);
4.对象像函数一样使用,是因为他重载了()运算符。int operator() (int val){ } :函数对象经常用做算法的实参。
5.函数对象
算术函数对象类型 plush<> minus<> .....
关系函数对象类型 equal_to<> less_equal<> ......
逻辑函数对象类型 logical_and<> ......
函数对象的适配器:2ge bind1st (b,e,) bind2nd() , 2ge 求反器: not1() not2()
类类型的转换:
1.转换函数必须是成员函数,不能指定返回值,并且形参表必须为空。 operator int () const { return val ; }