类和对象(上) C++

本节是对类初步的了解,熟悉以下内容:
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指针对对象进行操作时,则发生错误。

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

时间: 2024-10-22 20:15:37

类和对象(上) C++的相关文章

Effective JavaScript Item 51 在类数组对象上重用数组方法

Array.prototype对象上的标准方法被设计为也可以在其它对象上重用 - 即使不是继承自Array的对象.因此,在JavaScript中存折一些类数组对象(Array-like Objects). 一个典型的例子是函数的arguments对象,在Item 22中对它进行过介绍.该对象并不继承自Array.prototype,所以我们不能直接调用arguments.forEach来对其中的元素进行遍历.但是,我们可以通过首先得到forEach方法的对象,然后调用call方法(可以参考Ite

Python 类和对象-上

#类和对象 class Human: #属性 -> 成员属性(变量) ear = 2 mouth = 1 sex = 'man' age = 28 name = 'zhangwang' married = False color = 'yellow' #特征 -> 成员方法(函数) def walk(self): print('直立行走') def eat(self): print('吃饭') def sleep(self): print('睡觉') def playgame(self): p

[Effective JavaScript 笔记]第51条:在类数组对象上复用通用的数组方法

前面有几条都讲过关于Array.prototype的标准方法.这些标准方法被设计成其他对象可复用的方法,即使这些对象并没有继承Array. arguments对象 在22条中提到的函数arguments对象.它是一个类数组对象,并不是一个标准的数组,所以无法使用数组原型中的方法,因此无法使用arguments.forEach这样的形式来遍历每一个参数.这里我们必须使用call方法来对使用forEach方法. function highlight(){ [].forEach.call(argume

java类和对象的基础(笔记)

封装: 首先封装可以保护对象,防止用户直接存取对象的内部细节:其次封装也保护了客户端,防止对象实现部分的改变可能产生的副作用,即实现部分的改变不会影响到客户端的改变. 私有代码和数据仅能被对象本身的其他部分访问,不能被该对象外的任何程序部分所访问.当代码或数据是公有的时,虽然它们是定义在对象中的,但程序的其他部分也可以访问. 继承性体现了类之间的是一种(IS-A)关系. 类之间的关系还有组合.关联等. 类的修饰符 : 类的访问修饰符可以是public或者缺省.若类用public修饰,则该类称为公

结构与类的对象在引用上的不同之处

用到List<T>,T为结构时,new 对象,对象每次生成值存入list中,list存入每次生成的值;T为类时,new 对象,对象每次生成值存入list中,list存入的都会变成最近一次生成的值. 也就是说:结构与类,new一个对象时,结构每次引用对象都会生成不同的值,但类的对象每次生成的值都会把前面的值覆盖. 原因:结构对象每次生成的值都会开辟新的内存空间,来存放每次的值,而类对象每次生成的值都会只在原来new生成的对象内存空间中,内存固定,所以会把原来的值覆盖掉.即如下面所说:类: 类是引

C++ 关于类与对象在虚函数表上唯一性问题 浅析

[摘要] 很多教材上都有介绍到虚指针.虚函数与虚函数表,有的说类对象共享一个虚函数表,有的说,一个类对象拥有一个虚函数表:还有的说,无论用户声明了多少个类对象,但是,这个VTABLE虚函数表只有一个:也有的在说,每个具有虚函数的类的对象里面都有一个VPTR虚函数指针,这个指针指向VTABLE的首地址,每个类的对象都有这么一种指针.今天,我们就来解决这个问题,同一个类的不同对象,是不是拥有"相同"的虚函数表,这个相同是物理上的相同(内存地址)还是逻辑上的相同(数据结构).本文现详述如下!

二、类与对象(上)

从本节开始,介绍C#面向对象编程的基本内容. 与使用C语言等结构化编程语言不一样,使用C#编程,所有的程序代码几乎都放在类中,不存在独立于类之外的函数.因此,类是面向对象编程的基本单元. 在绝大多数面向对象语言中,一个类都可以包含两种成员:字段(Field)与方法(Method).字段与方法这两个概念是面向对象理论的术语,是通用于各种面向对象语言的.而在各种的具体面向对象语言(比如C#)中,可以简单的这样理解: 字段即变量,方法即函数. 类的字段一般代表类中被处理的数据,类的方法大多代表对这些数

C++之再续前缘(二)——类和对象(上)

1.类的构成:数据和函数 public:可以由在类外由类的对象访问 private:只能由类内的成员函数访问 protected:可以由本类的成员函数访问,也可以由本类的派生类的成员函数访问 访问权限关键字:private为默认的关键字 !!不能在类声明中给数据成员赋初值,也就是初始化,只有在类的对象定义后才能给数据成员赋初值 2.成员函数 根据访问权限分为三种成员函数,其中,私有成员函数只能被本类中的其他成员函数访问,公有成员函数在类外可以由该类的对象访问 另外还可以被分为普通的成员函数和内联

类与对象

1.1 类和对象的关系   为什么要采用面向对象思想进行程序设计与开发 1.可以实现代码的复用 2.符合人思考的方式   类和对象的定义 1.类的定义:用class关键修饰的叫做类 2.对象的定义:类名定义的数据类型   类和对象之间关系 1.由对象归纳为类,是归纳对象共性的过程 2.在类的基础上,将状态和行为实体化为对象的过程为实例化   1.2 定义类   定义类的语法,类主要由成员变量和成员方法构成(暂不提构造函数) eg: publicclassStudent { //成员变量 intn