zoukankan      html  css  js  c++  java
  • 【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();
    }
    
  • 相关阅读:
    Python使用SMTP模块、email模块发送邮件
    harbor搭建及使用
    ELK搭建-windows
    ELK技术栈之-Logstash详解
    【leetcode】1078. Occurrences After Bigram
    【leetcode】1073. Adding Two Negabinary Numbers
    【leetcode】1071. Greatest Common Divisor of Strings
    【leetcode】449. Serialize and Deserialize BST
    【leetcode】1039. Minimum Score Triangulation of Polygon
    【leetcode】486. Predict the Winner
  • 原文地址:https://www.cnblogs.com/vinnson/p/13451267.html
Copyright © 2011-2022 走看看