编程语言

img qq_39295755

类和对象基础

发表于2017/10/6 11:07:55  146人阅读

分类: C++

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

类和对象的关系
1>,类是对象的抽象,对象是类的实例化;
2>,定义一个类并没有分配实际的内存空间进行存储,而对象占有内存空间。
植物——类
松树——对象

类的声明和对象的定义
首先介绍一些基础知识
访问限定符:
public : 公有访问限定符;
private : 私有访问限定符;
protected : 受保护的访问限定符。
注:
1>,如果声明类的时候对访问权限不加以说明,则成员默认是private;
2>,public成员可以从类体外部直接访问,而private和protected不可以;
3>,访问限定符的作用域是从该访问限定符开始到下一个访问限定符或者到类体的结束右括号;
4>,访问限定符体现了面向对象的封装性。
这里简单介绍一下面向对象的封装性:将对象的行为和属性封装起来,对外代码不可见,只通过接口进行实现。

<类包括成员函数和成员变量>
成员函数 : 指把定义和原型写在类定义内部的函数。

成员函数定义在类体内部:

class Trapezium     
{
  public:
        int Area()
        {
           return ((upper+lower)*height)/2;
        }
  public:
        int upper;
        int lower;
        int height;
 }

成员函数定义在类体外部:类名+ :: (作用域解析符);来确定范围。

class Trapezium
{
  public:
        int Area();
  public:
        int upper;
        int lower;
        int height;
 }
 int Trapezium :: Area()
 {
    return ((upper+lower)*height)/2;
 }

First: 类的声明

class 类名
{
   访问限定符:
           成员函数和成员变量  
}

Second: 对象的定义

1>,类的类型已声明 (最常用)

 Time T1,T2;
 //Time为已经定义的类的类型,前面可以加也可以不加class.

2>,声明类型同时定义对象

class Time
{ 
  访问限定符:
           成员函数和成员变量  
}T1,T2;           

3>,直接定义,无类名

class 
{ 
  访问限定符:
           成员函数和成员变量  
}T1,T2;

对象大小计算 :每个对象的大小为类中所有成员变量的大小之和,遵循内存对齐原则。(这里和结构体内存对齐原则一样)

1>,结构体的首个成员在整体所占空间0偏移量的地址处;
2>,从第二个成员变量开始要对齐到对齐数的整数倍的地址处;
<对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值>
3>,结构体总大小为所有对齐数中最大对齐数的整数倍;
4>,当嵌套了结构体时,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体
的对齐数)的整数倍。

疑问1:为什么遵循内存对齐?
1>,内存对齐可以在编译阶段优化内存存取;
2>,经过内存对齐之后,CPU的内存访问速度大大提升;

这里写图片描述

疑问2:空类对象(无成员变量的类)的大小是多少?为什么?
C++标准规定,凡是一个独立的(非附属)对象都必须具有非零大小,那么空类对象大小到底是几呢???
验证之后:空类对象的大小为1。
原因简单的说第一个就是进行占位,先分配好地址,用的时候就方便;还有就是在进行计算大小的时候,保证sizeof()分母不为0。

隐含的this指针

 class Time
 {
    public:
           void Display()
            {
              cout<<_hour<<end1;
              cout<<_minute<<end1;
              cout<<_second<<end1;
            }
    private:
           int _hour;
           int _minute;
           int _second;
 }

编译器版:

 class Time
 {
    public:
           void Display(Time* this)
            {
              cout<<this->_hour<<end1;
              cout<<this->_minute<<end1;
              cout<<this->_second<<end1;
            }
    private:
           int _hour;
           int _minute;
           int _second;
 }
  1. this指针是指向每个成员函数的指针形参, this指针是隐式的;
  2. 构造函数没有这个隐含this形参;
  3. 编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参this指针;
  4. this指针是成员函数隐含指针形参,编译器进行处理,不能在成员函数的形参中添加this指针的参数定义,也不能在调用时显示传递对象的地址给this指针。
阅读全文
0 0

相关文章推荐

img
取 消
img