类的基本形式
C++的类是其面向对象编程思想的基石,类比C语言中的结构体,C++的类是一个对象相关属性的合集,比如一个对象是学生,那么他的身高,性别,性格,行为(函数)都可以作为他的属性。
class Student
{
public://类外可见
string name;
int height;
string character;
void behaviour()
{
}
};//不要漏掉分号
关于类的声明方式,有栈区普通对象以及堆区指针对象的方式,示例代码如下:
Student Xiaoming;
Xiaoming.name = "Xiaoming";
Xiaoming.height = 175;
Xiaoming.character = "introverted"
Xiaoming.behaviour();
Student *Xiaohua = new Student;
Xiaohua->name = "Xiaohua";
Xiaohua->height = 180;
Xiaohua->character = "extroverted"
Xiaohua->behaviour();
除了static类型的成员,必须通过对象的方法才能访问或调用。
访问修饰符
public:类外可见,结构体默认为该类型。
private:仅类内可见,类默认为该类型,若要改变则需单独声明修饰符。
protected:类及子类可见。
示例代码如下:
#include <iostream>
#include <cstring>
using namespace std;
class Cpeople
{
public://类外可见
int a;
private://只对该类可见
int b;
protected://类及子类可见
void fun_C(int s)
{
b = s;
cout << b << endl;
}
};
class Xiaoming : public Cpeople //子类继承
{
public:
void fun_X(int a)
{
fun_C(a);
}
};
int main()
{
Cpeople stu;
stu.a = 1;
//stu.b = 1; 私有成员不允许类外访问
//stu.fun_C(2); 受保护成员不允许类及子类外访问
Xiaoming stu2;
stu2.fun_X(5); //通过子类调用受保护函数protect。
return 0;
}
运行结果:
至此,三种访问修饰符介绍完毕。
友元函数
笔者不建议在实际应用中滥用友元函数,这样会破坏C++的封装性,不过同C语言的goto一样,见仁见智。
友元的作用一言以蔽之,使对象中的私有成员对类外可用。常见写法:
class Stu
{
private:
int a;
void fun_Stu()
{}
friend void fun(); //友元声明方式
}
void fun()
{
Stu c1;
c1.fun_Stu();
}
int main()
{
fun(); //此时运行,可以成功调用fun_Stu,但注意,此时仅仅对fun()可见,对main仍然不可见。
return 0;
}
友元类的声明方式与函数类似。
注意事项:
- 对于private和protected成员,可以通过友元使之对外可见。相当于public。
- 对于protected成员,除了通过友元对外可见,还可以通过子类继承的方式对外可见。
- 对于一个类,可以有多个友元,可以是类,函数等。
- 破坏了封装性,谨慎使用。
额外内容:类嵌套
class A
{
public:
class B
{};
};
A称为外部类,B称为内部类。
B不能直接访问A的成员,可以有两种做法去实现,一是在内部类创建一个外部类对象(新创建的类,与原类不属于同一个内存空间),二是定义一个外部类指针,通过构造函数初始化指针。
A访问B的成员直接在类内创建对象调用便可。