文章

滴水-day30-权限控制

在进行代码编写的时候发现有意思的一点

struct Peront
{
	// 私有化
private:
	int age;
	// 共有化
public:
	int sex;

	Peront(int age, int sex)
	{
		this->age = age;
		this->sex = sex;
	}

	Peront()
	{
		this->age = 0;
		this->sex = 0;
	}

	void SetAge(int age)
	{
		if (age >= 200)
		{
			cout << "错误" << endl;
			_exit(0);
		}
		this->age = age;
	}

};

struct Student:Peront
{
	int id;
	Student(int id)
	{
		this->id = id;
	}
	Student()
	{
		this->id = 2024;
	}
};

void Test_4()
{
Peront peront(100,200);
Student student(3);
Student* pStudent = &student;

cout << pStudent->sex << endl;
cout << pStudent->id << endl;
}

在我进行调试的时候我发现

cout << pStudent->sex << endl;

输出的还是0,这就让我百思不得其解,我明明已经调用Peront的构造函数传递参数了,但他还是输出了0,

通过动调发现,当子类继承父类的时候,在创建子类对象的时候会先调用的父类的无参构造函数,在调用子类的构造函数。

!https://cdn.nlark.com/yuque/0/2024/png/39210623/1727261032504-dfe74f9d-de84-48e1-99c4-b3caaf460716.png

这样就解释的通了,因为父类的无参构造函数就给sex赋值为0

Peront()
	{
		this->age = 0;
		this->sex = 0;
	}

私有化

1:不想让调用者直接修改成员变量

2:对成员变量添加控制

3.私有变量可以被继承但无法直接访问

对于结构体的成员变量,如果不想让调用者在创建对象的时候直接访问或修改成员变量,则可以对成员变量加上

private:
    int age;

这样语法,这样调用者就无法直接访问这个age变量了,同时结构体可以提供一个函数供调用者修改这个变量。

私有化只是对编译器而言的,编译器会检测语法,遇到直接访问私有变量会报错,

但是这不是绝对的,还是可以通过指针来访问私有变量。

Peront peront(100,200);
Student student(3);
Student* pStudent = &student;
// 虽然使用了private来限制变量访问,但还是可以使用指针来突破这个限制,在前面已经知道私有化变量还是会被继承
int* pPeront = (int*)&peront;
int GetAge = *pPeront;
cout << GetAge << endl;
// 通过子类的指针也可以访问到父类的私有变量
int* pStudent1 = (int*)&student;
cout << *pStudent1 << endl;

公共化

这个没什么好说的,就跟平时写的一样

public:
int age;

在结构体中如果不加权限控制则默认为公共的。

CLASS

class(类)与结构体在本质上是一样的,只是C++有这个语法

但在权限控制这方面还是有点不同的

class TestClass
{
public:
	int age;
	int sex;
	int id;

	TestClass(int age, int sex, int id)
	{
		this->age = age;
		this->sex = sex;
		this->id = id;
	}
	TestClass()
	{
		this->age = 0;
		this->sex = 0;
		this->id = 0;
	}

};

void Test_5()
{
	TestClass testclass;
	testclass.age = 0;

	MyClassTest myclasstest;

	// 不可访问,除非在子类添加权限控制
	myclasstest.id = 10;

	myclasstest.PrintData();

}

这里的创建对象和变量赋值都会报错

class类在创建的时候默认是私有化的,不能被创建对象也不能访问其成员变量,只有在class中声明一下这个是公共的才可以

class MyClassTest:public TestClass
{
public:
	int carid;
	MyClassTest(int carid)
	{
		this->carid = carid;
	}
	MyClassTest()
	{
		this->carid = 0;
	}
	void PrintData()
	{
		cout << this->age << endl;
		cout << this->id << endl;
	}
};

在继承class类的时候,子类无法直接访问父类的变量,需要把子类声明为公共的才可以。

总结

1.子类在创建对象的时候会先调用父类的无参构造函数

2.私有变量可以被继承

3.CLASS类默认为私有化

4.如果是CLASS继承CLASS则变量也默认为私有化,即使在父类中声明了公共的

License:  CC BY 4.0