• 高放的c++学习笔记之类


    类的基本思想是数据抽象封装
    1.this

    成员函数通过一个名为this的额外隐式参数来访问调用它的对象,当我们调用一个函数的时候,用请求该函数的对象的初始化this。

    如果某个类的名字为sale,某个对象为total,成员函数为isbn

    total.isbn()可以理解成sale::isbn(total);

    任何自定义名为this的行为都是非法的。

    因为this总是指向"这个”对象,所以this是一个常量指针,我们不允许改变this指向的地址。

    定义一个返回this的类

    class sale{
    public :
      int x;
      sale &th(){
        return *this;
      }
    };

    2.

    引入const成员函数

    我们在类内定义这样一个函数。

    int isbn()const{return this->book;}

    const关键字作用于函数时一个重要的作用就是修改隐式指针t,his指针的类型。

    (1).默认情况下this指针是指向类类型非常量版本的常量指针。这句话的意思是this是一个常量指针,指向的地址不可以改变,但指向的类的内容可以改变。

    (2).在默认情况下我们不能把this绑定到一个常量对象上面,也即是我们不能再常量对象上调用一个普通成员函数。

    (3).类中必须要有自己写的构造函数,这种类才可以声明const对象。

    3.

    构造函数

    如果一个类名为point,有一个int型成员名为a,一个char型的成员名为b,那么构造函数可以写成如下形式。

    point(int a,char b):a(a),b(b){};

    point():a(0),b(0);    //默认构造函数

    用构造函数做隐式转化

    构造函数可以接受一个参数的传入时,可以将此种类型对象隐式转化为此种类。

    class gaofang{
    public:

      string x;
      gaofang(const string x):x(x+"sa"){};
    };
    string cmp(gaofang a){  

      return a.x;
    }

    调用函数的时候可以这样调用

    cmp(string("sa"));

    不可以这样

    cmp("sa");

    因为这样有const char[]->string->gaofang的两步隐式转化,不可以连续的隐式转化。

    4.

    类的声明

    就像函数可以把声明和定义分开一样,我们也可以仅声明而不定义这个函数。

    class screen;        //screen类的声明

    我们将这种声明之后定义之前的类称作不完全类型。

    (1)不完全类型只能在非常有限的情况下使用,可以定义指向这种类型的指针或引用,也可以声明(不是定义)以不完全类型作为参数或返回类型的函数。

    (2)对于一个类来说,我们创建他的对象之前该类必须被定义过,而不能仅仅声明,否则,编译器就不知道这样的对象需要多少储存空间。

    5.

    友元函数

    类允许其他函数或其他类访问他的非公有成员,方法是将函数或类作为它的友缘,只需要在类中增加一条以friend开始的声明语句。

    class gaofang{
    friend int add(gaofang);

    private:
      int a;
    };
    int add(gaofang a){
      return a.a;
    }

    6.

    委托构造函数

    一个委托构造函数使用它的所属类的其他   构造函数执行他自己的构造过程,或者说将自己的只能委托给其他构造函数。

    gaofang(int a):a(a){};
    gaofang():gaofang(1){};

    7.

    默认构造函数

    定义:一个函数是默认构造函数,当且仅当调用它不需要传入任何参数,这个函数可以是用户定义的也可以是系统定义的

    8.拷贝构造函数

    如果一个构造函数的第一个参数是自身类型的引用,且任何额外的参数都有默认值,那么我们称这个函数是拷贝构造函数。

    我们如果自己没有定义拷贝构造函数,那么编译器会为我们定义一个合成拷贝构造函数,合成拷贝构造函数会逐元素拷贝。

    有以下两种拷贝初始化方式

    ⊙gaofang b(a);
    ⊙gaofang b = a;

    类有构造函数,会编译器会生成一个重载的赋值运算符。

    拷贝初始化的限制

    如果我们使用的初始化的要求通过一个explicit的构造函数来进行类型转化,那么使用拷贝初始化还是直接初始化就不是无关紧要的了。

    vector<int>v(10);        //正确,直接初始化

    vector<int>v = 10;         //错误,接受大小的参数是explicit的

    析构函数

    构造函数的初始化部分是按照他们在类中出现的顺序进行初始化,析构函数是按照构造的逆序进行销毁。

  • 相关阅读:
    AFNet3.0上传图片
    最新 AFNetworking 3.0 简单实用封装
    iOS开发密码输入数字和字母混合
    IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)(转)
    iOS开发探索-图片压缩处理
    常用第三方框架插件
    2.1创建直线
    1.4用向导创建Hello,world程序
    vs2008找不到ObjectARX MFC Support
    vc6.0错误:error C2653: 'CCreateEnt' : is not a class or namespace name
  • 原文地址:https://www.cnblogs.com/icodefive/p/4926308.html
Copyright © 2020-2023  润新知