从结构体到类
-
结构体权限为公有,无法很好的保护数据
- 封装的不好,不能对一些常用的行为进行函数封装
struct Person1
{
int age;//默认公有
};
class Person2
{
int age;//默认私有
};
class Person1
{
int age;
int get_age() { //定义结构体内部的函数
return age;
}
};
int main()
{
Person1 p;
p.get_age();//不可访问 无法进行函数的封装
}
类的构成概述
数据成员和成员函数
- 权限
- public(公有) 对内对外都完全开放
- private(私有) 只有本类的成员函数访问,而类外部的任何访问都是非法的。
- protected (保护)可以又本类的成员函数访问,也可以由该类的派生类成员函数访问,而类外的访问是非法的
- 一般设计
- 数据成员声明为私有成员,成员函数声明为公有成员
- 不能在类声明中给数据成员赋初值,错误行为(因为其实这就是个声明,根本都没有分配内存,需要定义了这个类才可以赋值
class Person2
{
public:
int get_age() { //公有
return this->age;
}
private :
int age;//私有
};
成员函数的定义
普通成员函数的定义
- 类内声明,类外定义
- 类外定义需加上类的作用
class Person2
{
public:
int get_age();//类内声明
private :
int age;
};
//类外定义 加上作用域
int Person2::get_age() {
return this->age;
}
内联成员函数的定义
- 隐式声明:不使用inline关键字,直接在类内部声明且定义
- 显示声明:在类中声明,类外定义并加上关键字inline(声明可加可不加,定义一定加关键字
class Person2
{
public:
int get_age() { //隐式声明
return this->age;
}
private :
int age;//私有
};
class Person2
{
public:
int get_age();
private :
int age;//默认私有
};
//类外定义 加上inline关键字、作用域
inline int Person2::get_age() {
return this->age;
}
对象的定义和使用
对象中成员的访问
- 习惯将成员属性私有化,但是我们可以在类外通过公有的类内函数来访问类的私有属性
int main()
{
Person2 p2;
p2.get_age();//通过公有成员函数访问私有属性
}
类的作用域和类成员的访问属性
- 类的声明中一对花括号形成的作用域,在此作用域内类内的任何成员函数可以不受限制的访问该类中的成员(eg.成员函数打印私有属性值),类外就要受到访问属性的限制了。
void Person2::set_age(int age)
{
this->age = age;//类作用域内访问不受限制
}
int main()
{
Person2 p2;
p2.age;//类外不可访问私有属性
}
对象赋值语句
- 可以直接给类赋值:(class A;A a, b; a = b)
- 对象类型必须相同
- 仅仅对数据成员赋值,数据成员占储存空间,不同的有不同的存储空间,而成员函数是占有相同的函数代码段,无法对它们赋值
- 类中存在指针时,赋值可能出现错误。(深拷贝、浅拷贝)
int main()
{
Person2 p1, p2;
p1.set_age(10);
p2 = p1;
p2.get_age();//打印10
}