C++ OOP(1)

发布时间 2023-10-08 19:26:37作者: dctwan

类声明

class ClassName{
	private:
   		// data member declarations;
    public:
    	// member funtion declarations;
};

成员函数

一般定义成员函数的方式是在类外,通过域解析运算符指定成员函数属于哪个类

#include <iostream>
#include <string>
using namespace std;

class MyClass{
    private:
        int my_num;
    public:
        void my_func();		//注意此处为成员函数声明,不带花括号{}
};

class YouClass{
    private:
        int you_num;
    public:
        void you_func();
};

void MyClass::my_func(){
    cout << "my function" << "\n";
}

void YouClass::you_func(){
    cout << "you function" << "\n";
}

int main(){
    MyClass mycls;
    YouClass youcls;
    mycls.my_func();
    youcls.you_func();
    return 0;
}

类声明和成员函数都完成之后,就可以使用ClassName obj这样的方式创建对象,并使用obj.member_func()这样的方式访问公共的成员,如上代码所示

构造函数和析构函数

构造函数:用于在创建对象时初始化一些成员变量

成员名和构造函数参数名

如果成员名和构造函数参数名同名,就会出现x = x这样的代码,这是错误的,一般类成员名前加上m_前缀

使用构造函数

显式调用/隐式调用

默认构造函数

用户没有定义特定的构造函数会存在一个默认构造函数,而定义过特定的构造函数之后,就没有默认构造函数了,此时再不初始化创建对象就会报错。一般对每个类都要显示定义一个默认构造函数,防止报错。

#include <iostream>
#include <string>
using namespace std;

class MyClass{
    private:
        int m_num;
    public:
        MyClass();
        MyClass(int num){
            cout << "call constructor" << "\n";
            m_num = num;
        }

        int getNum(){
            return m_num;
        }
};


int main(){
    MyClass mycls0;     //调用默认构造函数
    MyClass mycls1 = MyClass(10);   //显示调用构造函数
    MyClass mycls2(20);             //隐式调用
    cout << mycls1.getNum() << "\n";    
    cout << mycls2.getNum() << "\n";
    return 0;
}

析构函数

在对象使用结束之后完成清理工作,通常不显示调用析构函数

class MyClass{
	public:
    	MyClass();
    	~MyClass();
};

文件组织

  • MyClass.h

    MyClass类的声明

  • MyClass.cpp

    MyClass类方法实现

  • test.cpp

    使用MyClass

MyClass.h

#include <string>
using namespace std;

class MyClass{
    private:
        int m_num;
        string m_str;
    
    public:
        MyClass();
        MyClass(int num, string str);
        ~MyClass();
        void set_num(int num);
        void set_str(string str);
        int get_num();
        string get_str();

};

MyClass.cpp

#include <iostream>
#include <string>
#include "MyClass.h"
using namespace std;

MyClass::MyClass(){
    cout << "call default constructor" << "\n";
}

MyClass::MyClass(int num, string str){
    cout << "call my constructor" << "\n";
    m_num = num;
    m_str = str;
}

MyClass::~MyClass(){
    cout << "call destuctor" << "\n";
}

void MyClass::set_num(int num){
    m_num = num;
}

void MyClass::set_str(string str){
    m_str = str;
}

int MyClass::get_num(){
    return m_num;
}

string MyClass::get_str(){
    return m_str;
}

test.cpp

#include <iostream>
#include <string>
#include "MyClass.h"

int main(){
    MyClass obj1 = MyClass(1, "dctwan");
    MyClass obj2;
    
    obj2.set_num(2);
    obj2.set_str("hhhhh");
    cout << obj1.get_num() << obj1.get_str() << "\n";
    cout << obj2.get_num() << obj2.get_str() << "\n";

    return 0;
}

编译运行

g++ MyClass.cpp test.cpp
./a.out

this指针

作用一

类中的特殊指针,指向当前对象的实例,使用 this 指针,我们可以在成员函数中访问当前对象的成员变量,即使它们与函数参数或局部变量同名,这样可以避免命名冲突,并确保我们访问的是正确的变量

#include <iostream>
using namespace std;

class MyClass{
    private:
        int i;
        int num;
    public:
        MyClass(int i, int num){
            this->i = i;
            this->num = num;
        }

        void prin_info(){
            int i, num = 0;
            for(i = 0; i < 3; ++i){
                cout << this->i << " ";
            }
            cout << "\n class.num: " << this->num << ", func num: " << num << "\n"; 
        }
};

int main(){
    MyClass obj = MyClass(10, 1);
    obj.prin_info();
    return 0;
}

作用二

成员函数可能要处理2个对象,需要使用this指针

#include <iostream>
using namespace std;

//比较长方体的体积
class Box{
    private:
        double l, w, h;    //长,宽,高

    public:
        Box(double l, double w, double h){
            this->l = l;
            this->w = w;
            this->h = h;
        }

        double get_volume(){
            return this->l * this->w * this->h;
        }
        
        int compare(Box box){
            return this->get_volume() > box.get_volume();
        }
};


int main(){
    Box a = Box(2, 5, 4);
    Box b = Box(2, 1, 1);
    cout << a.compare(b) << "\n";
    return 0;
}