C/C++的面向对象
类的定义
不能直接给类成员进行初始化
如果定义类的时候没有写访问修饰符,则默认是private
如果在成员方法的后面加const,表示该方法内不能改变成员变量的值(如,getter加const,setter不加const)
const修饰的对象,只能调用const修饰的方法
class Student {
public:
Student();
virtual ~Student();
const string& getName() const {
return name;
}
void setName(const string& name) {
this->name = name;
}
private:
string name;
};
int main() {
const Student *stu = new Student();
//stu->setName("大黄"); //非法的,const修饰的对象只能调用const方法
cout << stu->getName() << endl;
return 0;
}
构造函数
构造函数在实例化一个对象的时候被调用
1、对于const和引用类型,必须要进行初始化,所以他们必须在初始化列表中进行初始化。
class Student{
public:
Student():name("属性默认值"), age(20){
}
Student(name):name(name), age(19){ //根据构造参数初始化属性
}
private:
string name;
const int age;
const int phone {110};
};
析构函数
析构函数在对象销毁前(回收内存前)被调用
class Student{
public:
~Student(){ //析构函数
}
private:
string name;
};
拷贝构造函数
每个类都有一个默认的拷贝构造函数
以下三种情况会调用拷贝构造函数:
1、一个对象以值传递的方式传给函数体
2、一个对象以值的方式被函数返回
3、一个对象被另一个对象返回
**note:**Java的对象传递类似于这里的引用传递,是不会重新构造一个对象的
class Student{
public:
Student(const Student& stu){ //拷贝构造函数
this->name = stu.name;
}
private:
string name;
};
Student fun(Student stu){
Student stu1;
Student stu2 = stu1;//此时会调用拷贝构造函数,并且stu2有自己内存空间
fun(stu1); //此时会调用拷贝构造函数
return stu1; //此时会调用拷贝构造函数
}
静态成员变量
静态成员变量类似于Java,是一个类所有对象的公共资源
note:静态成员的类型可以是当前类的类型,而其他类则不可以。其他的成员只能是当前类的引用或指针
为什么成员变量的类型不能是当前类
如果一个成员变量的类型是当前类,编译器就无法确定这个类的大小
静态成员函数
静态成员函数只能访问静态变量
静态成员函数不能定义为const
如果静态成员函数的定义是在类外面,则不能再用static修饰
this指针
为了实现this指针,编译器在调用成员函数时会隐式的把当前对象的地址以参数方式传递给函数
int main(){
Student stu;
stu.fun(); //等同于 stu.fun(&stu);
}