C++学习日记day03

来源:互联网 发布:林仕鼎 知乎 编辑:程序博客网 时间:2024/05/21 07:52
第三课
1. 初始化表的必要性
1) 类中包含常量和引用型的成员变量。必须通过构造函数和初始化表显式地对其进行初始化。
2) 在子类中显式地构造其基类部分。
class A {
public:
    A (void) {}
    A (int n) : m_n (n) {}
private:
    int m_n;
};
class B {
pulbic:
    B (void){}
    B (int n) : m_a (n) {}
private:
    A m_a;
};
2. 支持自定义类型转换的构造函数
在目标类型中定义如下形式的构造函数:
目标类::目标类 (const 源类& 源类引用) {...}
可以实现从源类到目标类的隐式类型转换。
通过使用explicit关键字可以指示该构造函数只能用于显式类型转换,以防止潜在的错误。
3. this指针
class A {
    void foo (B b) {...}
};
class B {};
A a;
B b;
a.foo (b);
a:调用对象;
b:参数对象。
1) 一般而言,关键字this表示一个指针,对于一般成员函数,该指针指向调用对象,而对于构造函数,它指向这个正在构造的对象。
2) this指针可用于在构造函数中区分与构造参数名相同的成员变量。
3) this指针可以用于返回自引用的场合。
4) this指针可以作为函数的参数实现对象间交互。
4. const对象和const成员函数
const char*
char* const
1) 常量型成员函数中的this指针为常量型,以此防止对成员变量的意外修改。
2) 通过常量类型的对象、引用或者指针,只能访问其常量类型的成员函数,否则将引发编译错误。
3) 被声明为mutable的成员变量可以在常量型成员函数中被修改。
4) 常量型成员函数与非常量型成员函数构成重载关系。
5) 通过常量型对象、引用或者指针只能调用常量型成员函数,而通过非常量型对象、引用或者指针优先调用非常量型成员函数。
const int n = 10;
void foo (const int& n) {...}
const char* foo (void) {...}
void A::foo (void) const {...}
5. 析构函数
1) 基本语法
class 类名 {
   ~类名 (void) {
       析构函数体;
   }
};
特征:没有参数,不能重载。
2) 缺省析构函数
A. 对于未定义析构函数的类,系统会提供一个缺省析构函数,该析构函数会调用成员及其基类的析构函数。
B. 缺省析构函数不负责释放动态分配的资源。
3) 对于动态分配的资源,必须通过自己定义的析构函数进行释放。
4) 析构函数所释放的资源不仅限于内存资源,还包括文件、socket、信号量等等。
练习:实现一个整型数组类IntArray
通过构造函数指定容量,注意析构释放资源。
push()在数组的尾部加入一个元素;
pop()从数组的尾部弹出一个元素;
get()根据下标获取一个元素的值;
set()根据下标设置一个元素的值;
print()打印数组。
提示:内部维护一个整型数组,动态分配,还要维护一个数组上限。
10 20 30 40
-------------------
0  1  2  3  top = 4
6. 拷贝构造函数和拷贝赋值运算符
A a1;
A a2 (a1);
A a2 = a1;
A* pa2 = new A (a1);
1) 缺省方式的拷贝构造函数就是按字节复制一份和拷贝源一模一样的副本。
2) 自定义拷贝构造函数:
class 类名 {
    类名 (const 类名& obj) {
        以拷贝的方式从obj复制成员变量的值;   
    }
};
3) 缺省方式的字节复制往往不能实现对象间的深拷贝,这时就需要提供自己定义的拷贝构造函数,以获得真正意义上的副本。
4) 拷贝构造的时机
A. 用同类型的对象做初始化;
B. 函数调用传递对象型参数;
C. 函数返回对象(受编译优化的影响)。
5) 拷贝构造只能解决构造对象副本时的深拷贝问题,缺省方式的拷贝赋值仍然是按字节复制,这种情况下就需要提供一个自定义的拷贝赋值运算符函数,以获得真正意义上的对象副本。
class 类名 {
    类名& operator= (const 类名& obj) {
        以拷贝的方式从obj复制成员变量的值;   
    }
};
注意:A. 先释放已有的资源然后再从拷贝源复制资源。
      B. 防止自赋值。
      C. 返回自引用,以支持连续赋值。
7. 静态成员
static
1) 静态成员是属于类的,非静态成员是属于对象的。可以在所有的该类的对象间共享。
2) 既可以通过对象也可以通过类访问静态成员。
3) 静态成员函数只能访问静态成员,不能访问非静态的成员。非静态成员函数既可以访问非静态成员,也可以访问静态成员。
4) 静态成员变量必须在类的外部定义并初始化。
5) 静态成员函数没有this指针。
6) 静态成员同样受访问控制的约束。
原创粉丝点击