c++类和对象相关基础知识

来源:互联网 发布:怎样评价魔兽世界 知乎 编辑:程序博客网 时间:2024/05/20 15:40
面向对象程序设计:
概念:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性,灵活性和扩展性。

面向对象的三大特性:
封装,继承,多态
类中包含:数据(成员变量)、程序(成员函数)

c++中的数据类型有基本数据类型、非基本数据类型。
基本数据类型又包含:字符型char,整形int,浮点型float/double,逻辑型bool,无类型void。
非基本数据类型包含:数组type[],指针type*,结构体struct,联合体union,枚举enum,类class。

c++中的三种访问限定符:public(公有),protected(保护),private(私有)
1、public成员可以从类外直接访问,但是protected和private不能直接从类外直接访问
2、每个限定符可以在类体中使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前
3、类体中如果没有定义访问限定符,则默认为私有的
4、类的访问限定符体现了面向对象的封装性。

类的作用域:局部域,全局域,类域,名字空间域
1、每个类都定义了自己的作用域,类的成员(成员函数/成员变量)都在类的这个作用域内,成员函数内可任意访问成员变量和其他成员函数。
2、对象可以通过,直接访问公有成员,指向对象的指针->也可以直接访问类的公有成员。
3、在类体外定义成员,需要使用::作用域解析符指明成员属于哪个类域。

接下来定义一个简单的类

class Person
{
 public:
       void Display()
       {
         cout<<_name<<"-"<<_sex<<"-"<<_age<<endl;
       }
 public:
       {
         char* _name;
         char* _sex;
         int   _age;
       }
};

void test()
{
  Person p;
 p_name = "jack";
 p_sex = "男";
 p_age = 18;
 p.Display();

 Person* ptr = &p;
 ptr->_name = "peter";
 ptr->_sex = "男";
 ptr->_age = 18;
 ptr->Display();
}


成员函数的声明和定义

class Person
{
 public:
    void Display()
 {
    cout<<_name<<"-"<<_sex<<"-"<<_age<<endl;
 }
 public:
 char* _name;
 char* _sex;
 int   _age;
}

类外定义成员函数

class Person
{
 public:
    void Display();
 public:
 char* _name;
 char* _sex;
 int   _age;
}

 void Person::Display()
       {
         cout<<_name<<"-"<<_sex<<"-"<<_age<<endl;
       }

类实例化对象

1、类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
2、一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量
3、打个比方,类实例化出对象就像现实生活中使用建筑设计图建造出房子,类就是设计图,只设计出需要什么东西,但是并没有具体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

前面的例子里面class Preson里面只是定义了person类,在下面的test函数里,Person p;p(p. _name = "jack";p._sex = "男";p._age = 18;)才是类person实例化出的具体对象。

类对象的存储模型              
每个对象的大小为类中所有成员变量的大小之和,当然也要遵循内存对齐原则

那么为什么要遵循内存对齐呢?

因为现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际情况实在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐,对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同,一些平台对某些特定的类型的数据只能从某些特定的地址开始存取,其他平台可能没有这种情况,但是最常见的是如果不按照合适其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设在32位系统上)如果存放在偶地址开始的地方,那么一个读取周期就可以读出,而如果放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该int数据。显然在读取效率上下降了很多。这也就是我们常说的一句话“以空间换时间”,一般情况下写程序不需要考虑内存对齐,编译器会替我们选择合适目标平台的对齐策略。

那空类对象(无成员变量的类)大小是多少呢?

其实空类的大小是1个字节,c++标准指出不允许一个对象(包括类对象)的大小为0,不用的对象不能具有相同的地址,这是由于:new需要分配不同的内存地址,不能分配内存大小为0的空间,避免出现sizeof(T)时得到的除以0的错误,故使用一个字节来区分空类。
原创粉丝点击