对象指的是类的实例,类不占有内存空间,只有实例化出的对象占内存空间。空类对象(无成员变量的类)的大小是1,因为空类同样可以被实例化,每个实例在内存中都有独一无二的地址。

class A
{};
int main()
{
	A a;
	cout<<sizeof(a)<<endl;//1
}

面向对象的三大特性:封装、继承、多态

有三种访问限定符:public、protected、private

1. public成员可从类外部直接访问,private/protected成员不能从类外部直接访问。

2. 每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。

3. 类体中如果没有定义限定符,则默认为私有的。

4. 类的访问限定符体现了面向对象的封装性。

类的作用域

1. 每个类都定义了自己的作用域,类的成员(成员函数/成员变量)都在类的这个作用域内,成员函数内可任意访问成员变量和其它成员

函数。

2. 对象可以通过 . 直接访问公有成员,指向对象的指针通过 -> 也可以直接访问对象的公有成员。

3. 在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。

类实例化对象

1.类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。

2.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量。

3.做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑

存在,同样的类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

#include <iostream>
using namespace std;

class student
{
public:
	void display();
	void display()
	{
		cout<<"name:"<<_name<<" "<<"age"<<_age<<endl;
	}
public:
	char *_name;
	int _age;
};

void student::display()
{
	cout<<"name:"<<_name<<" "<<"age"<<_age<<endl;
}

void test()
{
	student s1;
	student *p = &s1;
	s1._name = "sam";
	s1._age = 14;
	p->_name = "mike";
	p->_age = 15;
	//s1._num = "195947";
	//s1._sex = "nan";
	s1.display();
	p->display();
}

int main()
{
	test();
}

类对象存储模型

所以每个对象的大小为类中所有成员变量的大小之和,当然这里也遵循内存对齐原则。

class A
{
	char ch ;
	double d ;
};
class B
{
	char ch1 ;
	A a ;
	char ch2 ;
};

int main()
{
	A a;
	B b;
	cout<<sizeof(a)<<endl;//16
	cout<<sizeof(b)<<endl;//32
	return 0;
}