C++类和对象详解

article/2025/9/20 21:38:22

类与对象上篇:

主要内容:
1.类和对象的区别。
2.类的定义。
3.类的访问限定符和封装
4.类的作用域
5.类的实例化(用类类型创建对象)
6.计算类对象的大小
7.this指针

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

1.类和对象的区别:
类是抽象的,不占用内存。
对象是具体的,占用内存。
类是对象的抽象,而对象是类的具体事项;
比如说:类是蔬菜,那么对象就是青菜等等。

2.类的定义:

class className
{// 类体:由成员函数和成员变量组成}; 	// 一定要注意后面的分号

class为定义类的关键字ClassName类的名字{}中为类的主体注意类定义结束时后面分号
类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。

类的两种定义方式:

  1. 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义。
  2. 声明放在.h文件中,类的定义放在.cpp文件中。

一般情况下,更希望大家采用第二种方式。

3.类的访问限定符及封装
类的访问限定符:
public
protected
private
说明:

  1. public修饰的成员在类外可以直接被访问。
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的).
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
  4. class的默认访问权限为private,struct为public(因为struct要兼容C)。

经常会有面试题这样问大家:
问题:C++中struct和class的区别是什么?

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

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

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

封装的本质就是一种管理:比如博物馆的文物,我们如何管理呢?首先是键一座房子把文物给封装起来。然后我们开放了售票通道。可以买票突破封装在和合理的监管机制下去参观。类也是一样,我们使用类数据和方法都封装到一下。不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

4.类的作用域

  1. 每个类都定义了自己的作用域,类的成员(成员函数/成员变量)都在类的这个作用域内,成员函数内可任意访问成员变量和其它成员函数。
  2. 对象可以通过 . 直接访问公有成员,指向对象的指针通过 -> 也可以直接访问对象的公有成员。
  3. 在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
class Person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{cout<<_name<<" "_gender<<" "<<_age<<endl;
}

5.类的实例化
用类类型创建对象的过程称为类的实例化。

class Person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int _age;
};
void Test()
{Person man;man._name = "Peter";man._age = 10;man._sex = "男";man.PrintPersonInfo();}

6.计算类对象的大小

看代码:

class A
{
public:void TestFunc(){}int _a;char _b;
};class B
{
public:void TestFunc(){}
};// 空类
class C
{};// 类大小的计算方式:类成员变量加起来 + 内存对齐
// 求结构体大小一模一样// 空类和没有类成员变量的类的大小为一个字节
int main()
{cout << sizeof(A) << endl;cout << sizeof(B) << endl;cout << sizeof(C) << endl;system("pause");return 0;
}

运行结果
在这里插入图片描述
结论:一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类(包括没有成员变量的类)的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。(比如如果现在给了C1,C2,C3三个空类,如果不给内存,那就无法区分这3个类)

7 this指针

先定义一个日期类

class Date
{ 
public :void Display (){cout <<_year<< "-" <<_month << "-"<< _day <<endl;}void SetDate(int year , int month , int day){_year = year;_month = month;_day = day;}
private :int _year ; // 年int _month ; // 月int _day ; // 日
};
int main()
{Date d1, d2;d1.SetDate(2018,5,1);d2.SetDate(2018,7,1);d1.Display();d2.Display();return 0;
}

对于上述类,有这样的一个问题
Date类中有SetDate与Display两个成员函数,函数体中没有关于不同对象的区分,那当s1调用SetDate函数时,该函数是如何知道应该设置s1对象,而不是设置s2对象呢?
C++中通过引入this指针解决该问题,即:C++编译器给每个“成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动

编译器自动操作完成后:

class Date
{ 
public :void Display (Date* this){cout <<this->_year<< "-" <<this->_month << "-"<< this->_day <<endl;}void SetDate(Date* this,int year , int month , int day){this-> _year = year;this-> _month = month;this-> _day = day;}
private :int _year ; // 年int _month ; // 月int _day ; // 日
};
int main()
{Date d1, d2;d1.SetDate(2018,5,1);d2.SetDate(2018,7,1);d1.Display();d2.Display();return 0;
}

this指针的特性:

  1. this指针的类型:类类型* const
  2. 只能在“成员函数”的内部使用
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

关于this指针的一个面试题:

问题:下面程序能通过编译吗?如果崩溃,会在哪里奔溃?

class A
{ 
public:void PrintA() {cout<<_a<<endl;}void Show(){cout<<"Show()"<<endl;}
private:int _a;
};
int main()
{A* p = nullptr;p->PrintA(); p->Show();
}

答案:能够编译通过,但会崩溃。因为p指向空,然后在运行类中的成员函数时,会通过p找到this指针。此时就会越界访问


未完待续!!!


http://chatgpt.dhexx.cn/article/yiLPlgFn.shtml

相关文章

面向过程和面向对象区别

&#xff08;1&#xff09;从设计思路来看。 面向过程&#xff1a;程序设计的重点是分析解决问题的步骤&#xff0c;以及完成步骤的流程&#xff0c;是一种结构化自上而下的程序设计方法。面向对象&#xff1a;程序设计的重点是把构成问题的事物分解成对象&#xff0c;从局部着…

Java基础——类和对象

目录 一、类和对象的基本概念 二、类与对象的定义与使用 1.创建类的语法&#xff1a; 2. 创建具体的对象&#xff1a; 3.范例&#xff08;创建一个Person 类的对象&#xff09; 三、static关键字 &#xff08;一&#xff09;static修饰属性&#xff08;类属性、类变量&a…

类,对象,方法与函数的区别

面向对象&#xff08;Object oriented Programming&#xff0c;OOP)编程 的思想主要是针对大型软件设计而来的。面向对象编程将数据和操作数据相关的方法封装到对象中&#xff0c;组织代码和数据的方式更加接近人的思维&#xff0c;使程序的扩展性更强、可读性更好&#xff0c;…

C++的类和对象

目录 C面向对象的三大特性&#xff1a;封装、继承、多态 封装 构造函数和析构函数 构造函数的分类与调用 深拷贝与浅拷贝 类对象作为类成员 静态成员 成员变量和成员函数是分开存储的 const修饰成员函数 友元 运算符重载 继承 多态 C面向对象的三大特性&#xff1…

java实例和对象对象的区别_java中实例与对象的区别和联系

对象是抽象的说法&#xff0c;你可以把它看作一个符合它自身定义的所有实例的代表&#xff0c;而实例则是对象的现实体现。 你可以说一个实例是一个对象&#xff0c;但你不能说一个对象是一个实例。因为定义对象时只是把自身的规则和逻辑定义好&#xff0c;实例可以通过输入不同…

怎么来理解java类和对象的区别

对象在需求中的使用 在具体问题中如何使用面向对象去分析问题&#xff0c;和如何使用面向对象。 以把大象装冰箱为例进行分析&#xff1a;在针对具体的需求&#xff0c;可以使用名词提炼的办法进行分析&#xff0c;寻找具体的对象。 需求&#xff1a;把大象装冰箱里 对象&…

C++类对象和类指针的区别

好奇这个&#xff0c;所以参考了一些帖子&#xff0c;写下心得。 一篇转载率较高的帖子&#xff1a;C 类对象和 指针的区别 大佬都不贴结果。。。。所以这里我给出代码和结果&#xff1a; #include<iostream> using namespace std;class Test{ public:int a;Test(){a …

Java中类和对象的区别

一、类和对象 1、类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象类是对象的数据类型&#xff0c;类是具有相同属性和行为的一组对象的集合简单理解&#xff1a;类就是对现实事物的一种描述 类的组成 属性&#xff1a;指事物的特征&#xff0c;例如&#xff…

安装svn 汉化包 也不能设置中文

(以下为亲测!) 汉化包地址:https://osdn.net/projects/tortoisesvn/storage 进入地址之后:选择对应版本-->>Language Packs-->>选择中文包 问题: 已经安装svn汉化包,但是不能设置为中文. 解决: 确保汉化包版本对应svn版本.如果汉化包版本已经对应svn版本,则把…

SVN汉化失败的原因及解决方案(通过SVN官网下载SVN和相应的汉化包)

1、没删除SVN根目录语言包里的所有文件 2、汉化包没放在SVN根目录的语言文件夹下安装 3、SVN版本和汉化包版本不一致 首先看自己电脑上安装的svn是什么版本&#xff1a; 比如我的就是 TortoiseSVN 1.11.1&#xff0c;那我就要找TortoiseSVN 1.11.1对应的TortoiseSVN 1.11.1l…

Tortoise SVN 汉化(官网下载汉化包)

&#xff08;本操作是已经下载Tortoise SVN后 &#xff0c;通过官网下载汉化包进行的操作&#xff09; 1、首先进入到官网 https://tortoisesvn.net/downloads.html 2、进入到官网首页&#xff0c;点击Translations 3、进入到翻译页面&#xff0c;点击download 4、进入到下…

window eclipse快速导入svn项目以及软件汉化

刚入职新公司&#xff0c;之前几家公司使用得IDE跟代码管理是idea跟gitlab,公司内sap/erp系统&#xff0c;立项时间较早&#xff0c;使用得是eclipsesvn。 进行导入项目之前&#xff0c;英语水平较差得得同学&#xff0c;可以将软件先进行快速汉化 1、如图 2、在弹出得输入框中…

关于svn汉化包安装无效的解决办法

下载svn汉化包要和对应的svn客户端版本对应&#xff0c;否则安装无效&#xff0c; 在安装前要想将svn安装目录下的languages目录下的文件全部删除 还有一点要注意的是 汉化包安装要放在svn安装目录下进行安装&#xff0c;它才能正常汉化 安装完后就可以选择语言了

SVN安装包汉化VS插件

一.SVN客户端安装 首先下载SVN 地址&#xff1a;https://tortoisesvn.net/downloads.zh.html 根据版本进行选择 安装直接下一步下一步默认文件夹就好了 安装完成右键就会有二个多出来的菜单 都是英文不是很方便 二.语言转换 在下载SVN的下面就有语言包可以一起下载 进行语…

svn汉化插件安装步骤

1.svn安装好之后&#xff0c;查看svn安装的版本&#xff0c;比如我的svn是1.9.7.27907版本 64位的。 2.去svn官网&#xff1a;https://tortoisesvn.net/ 3.将网站显示中文版&#xff0c;便于查看&#xff1a; 4.点击“下载”&#xff1a; 5.看版本一致&#xff0c;往下拉&#…

SVN基本使用1

一、什么是SVN 代码管理工具 能记住每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复已删除的文件 二、跟Git比 SVN使用简单上手快支持中文(Git较为复杂不支持中文) 目录级权限控制(Git没有),企业级安全必备 可以单独子目录checkOut(Git只能将整个仓库),可以减少…

Svn下载及安装(附带汉化包安装)

1、访问Svn官方网站&#xff1a;https://tortoisesvn.net 2、找到需要下载的版本类型 3、下载完成后一直下一步安装即可 4、Svn安装包下载 5、下载完成之后&#xff0c;一直下一步即可 6、安装好之后&#xff0c;在任意空白位置 —> 右击 —> 选择TortoiseSVN —> …

Windows安装SVN客户端并汉化

1、下载 https://tortoisesvn.net/downloads.zh.html 2、安装 鼠标双击 3、汉化 汉化包下载地址&#xff1a;https://tortoisesvn.net/downloads.zh.html 鼠标双击汉化包 点击svn的各种界面查看是否汉化成功

SVN下载以及汉化安装包的使用

前言&#xff1a; SVN&#xff08;subversion&#xff09;是一个开放源代码的版本控制系统&#xff0c;通过采用分支管理系统的高效管理&#xff0c;实现资源的共享&#xff0c;实现集中式的管理。 SVN下载&#xff1a; 第一步&#xff1a; https://tortoisesvn.net/downloads…

SVN汉化以及简单的使用

一、SVN的安装以及汉化 1.下载SVN的安装包以及汉化包&#xff1b; 2.先安装SVN汉化包&#xff0c;然后安装SVN的程序软件&#xff0c;都安装完成后&#xff0c;在空白位置右击选择设置&#xff0c;在language中选择中文简体&#xff0c;点击确认即可&#xff1b; 至此&#xff…