滴水-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,
通过动调发现,当子类继承父类的时候,在创建子类对象的时候会先调用的父类的无参构造函数,在调用子类的构造函数。
这样就解释的通了,因为父类的无参构造函数就给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