首页 > 编程语言 > 详细

类和对象(上) C++

时间:2019-07-31 23:49:01      阅读:144      评论:0      收藏:0      [点我收藏+]

本节是对类初步的了解,熟悉以下内容:
1. 什么是类?什么是对象?面向对象和面向过程区别?
2. 如何定义一个类?用struct定义类和用class定义类的区别?
3. C++中如何实现封装?
4. 类的作用域:如何理解定义一个类,就定义了一个作用域?
5. 类的实例化:类为什么需要先实例化,才可以存储内容?
6. 如何求一个类的大小?空类的大小时多少,为什么?补充:什么是结构体内存对齐?为什么需要内存对齐?对齐参数如何设置?如何知道一个结构体相对于结构体起始位置的偏移量?什么是大小端?什么场景下需要考虑到大小端的情况?如何验证?
7. 什么是this指针?this指针的特性?this指针可以为空吗?this指针为空时,什么情况下代码一定崩溃?

1. 什么是类?什么是对象?

类:具有共同特征的事物所形成的种类(类别)。将具有某些共同属性的事物的共同属性总结出来,结果就是这些事物的种类(类别)。就像描述学生,有学号、姓名、年龄、性别、成绩等等属性,这些属性总结在一起,就是学生类。 在C++中,类中有事物的属性描述(数据元素),还有这些数据元素的初始化和赋值方式,以及类所能进行的活动(类的功能通过函数实现),即类中有数据元素,还有函数,甚至类中还有类,如学生类中还可以有班干部类。

对象:人们进行研究的具体的事物,如某个学生、或者其它的人事物都可以是对象。类实例化出来就是对象。

类和对象的关系:类实例化的结果就是对象。对对象的抽象描述就是类。类是模具,对象是铸件,将模具具化出来就是对象。

面向过程和面向对象有什么区别?

面向过程:从事物的发展过程来描述事物,从事件的发展步骤来分析事件,分析解决事件(问题)需要哪些步骤,然后实现这些步骤。强调的是步骤,在代码中体现为定义多个功能函数,然后按步骤将这些函数进行调用。

面向对象:将问题分解成多个对象,从事件的参与对象来分析事件,分析参与事件的对象有哪些,分别具有什么行为特性(功能),强调的是事件的对象以及对象的行为特性。在代码中体现为声明定义相关类,在类中定义出该类对象中的属性(数据元素),用函数描述行为(功能),然后实例化出需要的对象,通过对象与对象之间的交互来将问题解决。

2. 如何定义一个类?用struct定义类和用class定义类的区别?

定义类:class是定义类的关键字(struct也可以定义类),classname是类的名字,{}中是类的主体,主体中可以声明友元、定义函数、定义元素,结束时加分号。

class classname    //class是类关键字, classname是类名
{
      //括号中为类的主体,定义类的成员
};   //结束分号不能少

//定义二一个学生类
class student
{
    int Id[15];
    char name[10];
    int age;
    int gender;

};

 

C++中的类是C语言中结构体的加强,所以c++中的类其实也是结构体,但与C中的结构体有明显的区别,C语言的结构体中只能定义变量,而C++中结构体可以定义变量,还可以定义函数。

在C++中,struct定义的类中的元素默认是共有的,外部可以访问,而class定义的类中元素默认是私有的,外部没有访问权限(友元除外)。(C++中喜欢使用class定义类)。 在C语言中,结构体中只能定义变量。

 

3. C++中如何实现封装?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和外界进行交互。本质上是一种管理。(如我们在网上冲浪时,我们的网名就是公开的属性,其他人能看到,而我们真实名字别人一般看不到,我们就是将真实姓名、身份证号等信息保护起来,不公开,而网名公开,信息管理) 用类将对象的属性与方法结合在一起,让对象更加完善。使用访问限定符来对规定访问权限,通过访问权限选择性的将其接口提供给外部的用户使用。 访问限定符有三个:1、public(公有)修饰的成员在类外可以直接被访问。                   2、protected(保护)和private(私有)修饰的成员在类外不能直接被访问。 访问权限的作用域从该访问限定符出现的位置开始,到下一个访问限定符出现位置。 class声明的类默认访问权限为private,struct声明的类默认访文权限为public,因为struct要兼容C。在C中结构体的元素外部可以访问。 访问限定符只在编译时有用,数据映射到内存后,没有任何访问限定符的区别。即过了编译阶段,访问限定符就不在起作用。

class student
{
public:
    student()
    {}
    int A =5;
protected:

private:
    char Id[15] ;
    char name[10];
    char gender;
    int age=18;
};

int main()
{
    student a;
    printf("%d\n", a.A);//能正常访问
    //printf("%d\n", a.Id);//会报错,a.Id不可访问

    sizeof(a);
    return 0;
}

 

4. 类的作用域:如何理解定义一个类,就定义了一个作用域?

类是对某种类型的对象的属性(数据元素)和方法(函数)的描述集合,这些属性和方法在类中才起作用,在类外要使用类中的成员时,需要用作用域解析符指明成员属与那个类域。

5. 类的实例化:类为什么需要先实例化,才可以存储内容?

用类创建对象的过程称为类的实例化。 类是设计出的图纸,定义一个类,就是设计出某种图纸,不能说有了图纸就有了产品,就像画饼充饥,并不能真的画出大饼。只有真的做出大饼,才能在大饼中夹肉和蔬菜。(在陕西上学但是真的不喜欢吃肉夹馍 (QAQ))。 定义出一个类是不分配实际的内存空间来存储这个类的,就行int和char等类型,都是用来描述某一类数据或对象的特性的。 类只有实例化出对象,才分配物理存储空间,才能在对象中添加每个对象的真实数据。

6. 如何求一个类的大小? 一

个类的大小是该类中成员变量的大小之和,注意内存对齐。

空类的大小时多少,为什么?

空类的大小是一个字节。编译器给空一个字节的空间来唯一标识这个类。

什么是结构体内存对齐?

在结构体中,给大小不同的类型的成员变量,按一定规则去开辟空间存储,使成员变量按一定大小规律去存储。 默认的对齐方式是结构体中的成员变量,按其定下顺序,上一个变量的字节数是下一个的整数倍或相等,所有变量大小相加,结果调整到最大类型字节数的最小整数倍。

内存对齐中几个关于对齐值的概念:

1、基本类型自身对齐值:系统内置类型的大小,如char和int等类型的字节数就是它们的自身类型对齐值。

2、自定义类型对齐值: 结构体内部成员中,最大类型的字节数就是自定义类型对齐值。

3、程序指定的对齐值:通过 使用#pragma pack(n)来手动指定对齐值的大小  n要是2的次方,如1,2,4,8等。

4、有效对齐值:内存对齐时,将默认方式对齐值与程序指定对齐值进行比较,谁小谁就是有效对齐值。

为什么需要内存对齐?

1、不同的平台读写数据的方式不同,为了兼容性,需要做内存对齐。

2、提高效率,没有对齐的内存,访问时处理器要做两次访问工作,而对齐的内存,访问时处理器只用做一次工作。

对齐参数如何设置?

程序指定的对齐值:通过 使用#pragma pack(n)来手动指定对齐值的大小  n要是2的次方,如1,2,4,8等。

如何知道一个结构体相对于结构体起始位置的偏移量?

结构体的偏移量:结构体内某个成员变量相对于结构体地址的偏移值。(我自己的理解就是,成员变量的地址和结构体的起始地址的差值)。 求偏移量就用成员变量的地址减去结构体的起始地址。

技术分享图片

 

什么是大小端?

大端模式:数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。内存地址从左往右依次增大,我们的读数习惯就是大端模式。12345(万千百十个)。

小端模式:数据的高字节保存在内存的高地址中,数据的低字节保存在内存的低地址中。将权值与地址的高低结合起来,高地址部分权值大,低地址部分权值小。古人从右往左读的方式。如(个十百千万)五十四百三千二万一(54321)。

什么场景下需要考虑到大小端的情况?

查看内存中存储的数据时,我们将读取的数据进行组合还原时就要考虑大小端。

如何验证? 举一个简单的验证方式,代码如下

void CheckMode()
{
    int a = 0x1234;
    char b = *(char*)&a;
    if (b == 0x12)
    {
        printf("大端模式.\n");
    }

    else
        printf("小端模式.\n");

}

int main()
{
    CheckMode();
    return 0;
}

 

7. 什么是this指针?

this是c++中的一个关键字,是一个const修饰的指针。是成员函数中的一个默认形参,接收调用该函数的对象。 它指向当前对象,即调用成员函数的对象,通过它能访问到当前对象的成员变量和成员函数。

this指针的特性?

不用传参,const修饰的指针,是对象中成员函数的默认形参,不写在代码中,指向当前对象,通过它能访问到当前对象的成员。只能在函数的内部使用,在函数中,不在对象中。编译时通过压栈的方式传递。不能再static函数中使用。

this指针可以为空吗?this指针为空时,什么情况下代码一定崩溃?

可以为空,在不要通过this指针进行操作时,this指针可以为空。但如果需要用this指针对对象进行操作时,则发生错误。

类和对象(上) C++

原文:https://www.cnblogs.com/fengkun/p/11279857.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!