• 【C++】类-基础知识


    类-基础知识

    1. 语法定义

    class class_name{
        public:
        公有成员(对外接口)
        private:
        私有成员(私有接口)
        protected:
        保护性成员
    }
    
    • 成员包含了数据和方法两个部分

    • protected与private类似,其差别表现在继承与派生时对派生类的影响不同

    • 例子(点类)

      class Point
      {
      public:
          //构造函数
      	Point(int xx=0, int yy=0) :x(xx), y(yy) {
      		cout << "Calling contruction function of Point..." << endl;
      	}
          //复制构造函数
      	Point(Point &p) {
      		cout << "Calling copy construction function of Point.." << endl;
      		x = p.getX();
      		y = p.getY();
      	}
          //类方法
      	int getX() { return x; }
      	int getY() { return y; }
      	void show() {
      		cout << "(" << x << "," << y << ")" << endl;
      	}
      private:
      	int x, y;
      };
      

    2. 类的实现

    • 数据成员定义在类内
    • 方法可以定义在类内,也可以在类外(类名加作用域限定符,指明这个函数是属于这个类的)

    3. 三个基本的函数

    3.1 构造函数

    功能

    用于在创建类时给类设定初值

    形式

    • 函数名就是类名
    • 没有返回值类型和return语句
    • 可以有形参,也可以没有形参
    • 可以是内联函数
    • 可以重载(可以定义多个构造函数,符合语法即可)
    • 可以带默认参数,如果所有的参数都带默认参数,该构造函数就是默认构造函数

    Note:在声明中定义了默认参数时,实现中不能再指定默认参数。下面代码运行会报错

    void func(int x = 0);
    void func(int x = 0){
        cout << x << endl;
    }
    

    调用时机

    • 按照构造函数形式初始化类
    • 类之间的相互赋值=(不是复制构造函数)

    默认构造函数

    • 未定义构造函数时,编译器默认不生成构造函数,如果需要,则指定为class_name()=default

    • 默认构造函数的函数列表为空

    • 类内定义了数据的初始值时,用初始值初始化,否则以默认方式初始化

    • 基本数据类型的初始化值不确定!

    3.2 复制构造函数

    功能

    用一个已经初始化好的对象去初始化本类的一个新对象,形参为已知对象的引用(因为复制构造函数还未定义,无法通过复制的方式传递参数)

    形式

    class 类名 {
    public :
        类名( 形参);//构造函数
        类名( const 类名 &对象名);//复制构造函数
        // ...
    };
    
    • 未定义复制构造函数时,编译器会生成默认的复制构造函数
    • 不让编译器生成默认构造函数需要用=delete指定

    调用时机

    • 函数参数传递
    • 函数返回值
    • 以本类的一个对象作为初始值定义新的对象

    3.3 析构函数

    • 完成对象被删除前的一些清理工作。
    • 在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
    • 如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数,其函数体为空。
    • 声明为~class_name()

    4. 类组合

    概念

    一个类中的成员是另一个对象。比如线段类包含了点类:

    class Line
    {
    //public:
    //	Line(Point pp1, Point pp2);
    //	Line(Line &l);
    //	double get_len() { return len; }
    
    private:
    	Point p1, p2;
    	double len;
    };
    

    设计

    • 要同时对本类基本成员和对象成员初始化

    • 声明:

      类名::类名(对象成员所需的形参,本类成员形参):对象1(参数),对象2(参数), ......
      {
      //函数体其他语句
      }
      

      Note:冒号后面的部分实际上是在调用复制构造函数。也可以将该部分省略,放到函数体内用=赋值

    实例:线段类

    // 点类
    class Point
    {
    public:
    	Point(int xx=0, int yy=0) :x(xx), y(yy) {
    		cout << "Calling contruction function of Point..." << endl;
    	}
    	Point(Point &p) {
    		cout << "Calling copy construction function of Point.." << endl;
    		x = p.getX();
    		y = p.getY();
    	}
    	int getX() { return x; }
    	int getY() { return y; }
    	void show() {
    		cout << "(" << x << "," << y << ")" << endl;
    	}
    private:
    	int x, y;
    };
    
    //线段类
    class Line
    {
    public:
    	Line(Point pp1, Point pp2);
    	Line(Line &l);
    	double get_len() { return len; }
    
    private:
    	Point p1, p2;
    	double len;
    };
    
    Line::Line(Point pp1, Point pp2)
    : p1(pp1), p2(pp2){
    	cout << "Calling constuction function of Line..." << endl;
    	double x = pp1.getX() - pp2.getX();
    	double y = pp1.getY() - pp2.getY();
    	len = sqrt(x * x + y * y);
    }
    Line::Line(Line &l){
    	p1 = l.p1;
    	p2 = l.p2;
    	len = l.get_len();
    }
    
  • 相关阅读:
    QLineEdit控件只能输入数字--QValidator结合正则
    谈 Linux,Windows 和 Mac (转自 王垠)
    看了王垠的文章《对Rust语言的分析》
    unsigned int 无符号整型的使用
    Qt布局Layout设置完全填充(设置Layout的Margin值)
    C#批量删除Mysql中相同前缀的表格
    libusb
    NPOI -- 读取excel表格中的时间格式
    spring项目启动执行
    kafka安全(一)SASL+ACL
  • 原文地址:https://www.cnblogs.com/vinnson/p/13451267.html
Copyright © 2020-2023  润新知