什么是面向对象
概念:是一种程序设计范型,同时也是一种程序开发的方法。
对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
C + + 不是纯面向对象语言,而是基于面向对象的语言
(ps : 因为它包含C 的部分,C 是面向过程)
面向对象三大特性
封装,继承,多态
三种访问限定符
protected(保护),private(私有),public(公有)
- public成员可从类外部直接访问,private/protected成员不能从类外部直接访问。
- 每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。
- 类体中如果没有定义限定符,则默认为私有。
- 类的访问限定符体现了面向对象的封装性。
类的作用域
- 每个类都定义了自己的作用域,类的成员(成员函数/成员变量)都在类的这个作用域内,成员函数内可任意访问成员变量和其它成员函数。
- 对象可以通过 . 直接访问公有成员,指向对象的指针通过 -> 也可以直接访问对象的公有成员。
在类体外定义成员,需要使用 : : 作用域解析符指明成员属于哪个类域。
下面实现一个简单的类:
class Person
{
public:
void show()//成员函数
{
cout << _name << "-" << _sex << "-" << _age << endl;
}
public:
char* _name;//成员变量
char* _sex;
int _age;
};
int main()
{
Person p;
p._age = 18;
p._name = "林在范";
p._sex = "男";
p.show();
Person* s = &p;
s->_age = 18;
s->_name = "Mark";
s->_sex = "男";
s->show();
system("pause");
}
类对象存储模型
每个对象的大小为类中所有成员变量的大小之和,当然这里也遵循内存对齐原则。
类似结构体内存对齐原则。
【面试题】
1 . 为什么要内存对齐?
2 . 空类对象(无成员变量的类)的大小是多少?为什么?
3 . A和B类型的大小分别多少?
class A
{
char ch;
double d;
};
class B
{
char ch1;
A a;
char ch2;
};
解答:
1.以空间换时间,访问内存,如果按4字节的整数倍读取内存,对齐只需读取一次,反之,将读取多次。如果内存不对齐,会浪费空间。
struct AA
{
char ch;
int i;
};
读取情况如下:
2.空类对象大小为1,表示该类存在过。
windows下对齐数为8,linux下为4
class A
{
};
int main()
{
cout << sizeof(A) << endl;//1
}
3.类A的大小为:8+8=16;类B的大小为8+16+8=32。(同结构体的内存对齐原则)
算了,还是写写吧!
结构体内存对其规则:
- 第一个成员在与结构体变量偏移量为0 的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
//对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 - 结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数) 的整数倍。
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
以上!