C++ OOP(1)
类声明
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;
}