C++类和对象

Posted 流浪孤儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++类和对象相关的知识,希望对你有一定的参考价值。

目录

1.面向过程和面向对象初步认识

2.类的引入

3.类的定义

 3.1 声明和定义全部放在类体中

 3.2声明放在.h文件中,类的定义放在.cpp文件中

4.类的访问限定符及封装

 4.1访问限定符

4.1.1【访问限定符说明】

4.1.2【面试题】

4.2封装

5.类的作用域

6.类的实例化


1.面向过程和面向对象初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

2.类的引入

  C++中class与struct都可以用来定义类,class默认访问限定符是私有的,

struct默认访问限定符是共有的,因为C++兼容C语言,所以struct还可以

作为结构体使用

C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>

using namespace std;

//结构体里面可以定义:1.成员变量  2.成员函数

struct Student//里面的成员默认是公有的

{

    void SetStudentInfo(const char* name, const char* gender, int age)

    {

       strcpy(_name, name);

       strcpy(_gender, gender);

       _age = age;

    }

    void PrintStudentInfo()

    {

       cout << _name << " " << _gender << " " << _age << endl;

    }

    char _name[20];

    char _gender[3];

    int _age;

};

int main()

{

    Student s;

    s.SetStudentInfo("Peter", "", 18);

    return 0;

}

上面结构体的定义,C++中更喜欢用class来代替

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>

using namespace std;

//类的定义:1.成员变量  2.成员函数

class Student//里面的成员默认是私有的

{

    public:

       void SetStudentInfo(const char* name, const char* gender, int age)

       {

           strcpy(_name, name);

           strcpy(_gender, gender);

           _age = age;

       }

       void PrintStudentInfo()

       {

           cout << _name << " " << _gender << " " << _age << endl;

       }

    private://这里的成员是私有的,要访问通过上面公开的函数接口进行使用

       char _name[20];

       char _gender[3];

       int _age;

};

int main()

{

    Student s;

    s.SetStudentInfo("Peter", "", 18);

    s.PrintStudentInfo();

    //s._age=20;私有的不可访问,不写public默认私有

    return 0;

}

3.类的定义

class className

{

    // 类体:由成员函数和成员变量组成

}; // 一定要注意后面的分号

class定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号

类中的元素称为类的成员:类中的数据称为类的属性或者成员变量;  类中的函数称为类的方法或者成员函数类的两种定义方式:

 3.1 声明和定义全部放在类体中

 需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

 3.2声明放在.h文件中,类的定义放在.cpp文件中

一般情况下,更期望采用第二种方式 

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>

using namespace std;

//定义一个类

//封装

//1.将数据和方法定义在一起

//2.把想给你看到的数据给你看,不想给你看的封装起来->使用访问限定符

class Stack

{

public:

    //1、成员函数(的声明)

    void Push(int x);//在类里面声明,在类外面定义

    void Pop()//在类里面定义

    {

       ;

    }

    void Empty();

private:

    //2、成员变量(的声明)

    int* _a;

    int _size;

    int _capacity;

};

//1C语言中struct是用来定义结构体的

//2C++中,兼容Cstruct定义结构体的用法,但是同时struct也可以用来定义类

//3C++中使用classstruct定义类的区别:默认的访问限定符

//C中这样定义结构体的

struct ListNod_C

{

    int _val;

    struct ListNode_C *_next;

    struct ListNode_C *_prev;

};

//C++

struct ListNode_CPP

{

    int _val;

    struct ListNode_CPP *_next;//C++兼容C,这里看成用C语言定义结构体指针

    ListNode_CPP *_prev;//C++更喜欢这样定义类的属性或方法

    //还可以定义函数->成员函数

    ListNode_CPP* CreateNode(int val);

};

void Stack::Push(int x)//类外面定义

{

    ;

}

class A//只定义了成员函数

{

    int Add(int x, int y)

    {

       return x + y;

    }

};

class B//只声明了成员变量

{

    int BVal;

};

class C//空类

{};

int main()

{

    //类实例化对象,相当于定义出了类的成员属性与成员方法

    Stack s1;

    Stack s2;

    Stack s3;

    s1.Push(1);

    //对象中只存储了成员变量,不存储成员函数

    cout << sizeof(s1) << endl;//12

    //一个类实例化出N个对象,每个对象的成员变量都可以存储不同的值,但是调用的函数是同一个

    //如果每个对象都放成员函数,而这些成员函数却是一样的,浪费空间

    //一个类实例化对象的大小,就是计数成员变量之和,并且考虑内存对齐

    //没有成员变量的类的对象大小为1,开一个字节不是为了存储数据,而是占位表示该对象存在

//类的大小即类实例化的对象的大小

    A a;

    A aa;

    A aaa;

    return 0;

}

4.类的访问限定符及封装

 4.1访问限定符

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用

 

4.1.1【访问限定符说明】

1.public修饰的成员在类外可以直接被访问

2.protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

​​​​​​​4.class的默认访问权限为private,struct为public(因为struct要兼容C)

 注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

4.1.2【面试题】

问题:C++structclass的区别是什么?

解答:C++需要兼容C语言,所以C++struct可以当成结构体去使用。另外C++struct还可以用来定义类。 和class是定义类是一样的,区别是struct的成员默认访问方式是publicclass是的成员默认访问方式是

private

4.2封装

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

在类和对象阶段,我们只研究类的封装特性,那什么是封装呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们  首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。  不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。

5.类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。

 

class Person

{

public:

void PrintPersonInfo(); private:

    char _name[20]; char _gender[3]; int _age;

};

// 这里需要指定PrintPersonInfo是属于Person这个类域

void Person::PrintPersonInfo()

{

    cout << _name << " "_gender << " " << _age << endl;

}

6.类的实例化

用类类型创建对象的过程,称为类的实例化

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

以上是关于C++类和对象的主要内容,如果未能解决你的问题,请参考以下文章

植物大战 类和对象 ——C++

c++ — 类和对象

C++学习摘要之一:类和对象

C++初阶---类和对象

C++类和对象

深入理解C++类和对象(下)