📅  最后修改于: 2023-12-03 14:39:58.889000             🧑  作者: Mango
C++是一门面向对象的编程语言,结构体和类都是其面向对象编程的重要组成部分。本文将探讨在C++中结构体和类的定义、声明、访问权限、继承以及成员函数等方面的知识点。
结构体是一种用户自定义类型,可以组合不同类型的变量,形成一个新的结构体类型。可以理解为一个包含不同成员变量的变量集合,在C++中结构体的定义如下:
struct 结构体类型名{
数据类型1 成员变量名1;
数据类型2 成员变量名2;
//……
};
例如下面的结构体表示一个三维向量:
struct Vector3{
float x;
float y;
float z;
};
结构体中的成员变量可以像普通变量一样进行访问:
Vector3 vec1;
vec1.x = 1.0f;
vec1.y = 2.0f;
vec1.z = 3.0f;
类是一种用户自定义类型,也可以组合不同类型的变量,形成一个新的类类型。在C++中类和结构体的定义几乎是一样的,只是默认的访问权限不同,结构体默认为public,而类默认为private。在C++中类的定义如下:
class 类名{
private:
//private成员变量
public:
//public成员变量
//成员函数
};
例如下面的类表示一个学生:
class Student{
private:
int id;//学号
int age;//年龄
public:
char name[20];//姓名
void set_id(int I){//设置学号
id = I;
};
void set_age(int A){//设置年龄
age = A;
};
int get_id(){//获取学号
return id;
};
int get_age(){//获取年龄
return age;
};
};
我们可以通过成员函数来设置和获取类的私有成员变量:
Student stu1;
stu1.set_id(1001);
stu1.set_age(18);
strcpy(stu1.name, "Tom");
cout<<"name: "<<stu1.name<<", id: "<<stu1.get_id()<<", age: "<<stu1.get_age()<<endl;
在类中,成员变量和成员函数可以被声明为public、private或protected。public成员可以在类的外部访问,private成员只能通过类的成员函数来访问,protected成员只能被类的派生类访问。在类中,默认的访问权限是private。例如:
class MyClass{
public: //公有
void myPublicFunction(){
//...
}
protected: //保护
void myProtectedFunction(){
//...
}
private: //私有
void myPrivateFunction(){
//...
}
};
C++中的继承方式分为public、private和protected,它们的区别在于派生类继承了基类的成员后的访问权限不同。public继承表示基类的public成员在派生类中仍然是public成员,protected继承表示基类的public和protected成员在派生类中均变为protected成员,private继承表示基类的public和protected成员在派生类中均变为private成员。例如:
class Base{
public:
int a;
protected:
int b;
private:
int c;
};
class Derived1 : public Base{
public:
void myPublicFunction(){
a = 1;
b = 2;
// c = 3; //不能访问基类的私有成员
}
};
class Derived2 : protected Base{
public:
void myPublicFunction(){
a = 1;
b = 2;
// c = 3; //不能访问基类的私有成员
}
};
class Derived3 : private Base{
public:
void myPublicFunction(){
a = 1;
b = 2;
// c = 3; //不能访问基类的私有成员
}
};
成员函数是类中的函数,它可以访问类内的所有成员,包括公有、保护和私有成员,也可以访问其他对象的成员函数。成员函数定义时需要在函数名前面加上类名,例如:
class MyClass{
public:
void myFunction(){
//...
}
};
成员函数可以像普通函数一样进行调用:
MyClass obj;
obj.myFunction();
此外,成员函数还可以被重载。重载是指在同一个类中定义多个函数,它们的函数名相同但参数类型或数量不同。例如:
class MyClass{
public:
void myFunction(){
//...
}
void myFunction(int a){
//...
}
};
我们可以根据需要选择不同的函数进行调用:
MyClass obj1;
obj1.myFunction();
MyClass obj2;
obj2.myFunction(1);