首页 > 编程语言 >C++ : 四、面向对象编程(1)

C++ : 四、面向对象编程(1)

时间:2024-12-01 22:05:44浏览次数:13  
标签:析构 函数 对象 成员 C++ int 面向对象编程 构造函数

(一)面向对象的概念

面向对象编程是一种编程范式,它以对象为核心来组织程序结构。对象就是在现实世界中,某个具体的实体在计算机世界中的映射和体现。在 C++ 中,对象是类的实例,类是一种用户自定义的数据类型,它封装了数据(成员变量)和操作这些数据的函数(成员函数)。

比如:银行中实体的柜员,可以进行分析,并将其概念化为具有工号、姓名、性别等状态,和具有存款取款等行为的集合。在C++中就可以设计一个class类,再通过实例化对象,模拟现实中不同的柜员。

(二)状态和行为是对象的主要属性

成员变量是对象的属性(变量、指针数组等),属性的值确定对象的状态。。例如,在一个 汽车对象中,汽车的颜色、当前速度、燃油量等都是汽车对象的状态。

成员函数是对象的方法,确定对象的行为。以汽车为例,汽车的启动、加速、刹车、转弯等操作都是汽车对象的行为。

(三)类的设计与实例化对象

1、类的设计

class Student 
{
public:
    // 公共成员变量
   string student_id;

     // 构造函数
    Student(const string& name, int age, const string& student_id)
        : name(name), age(age), student_id(student_id) {}

    void getDetails() const 
    {
        cout << "Name: " << name << ", Age: " << age << ", Student ID: " << student_id << 
      endl;
    } 

protected:
    // 受保护的成员变量
    int age;

private:
    // 私有成员变量
    string name;
};

其中“class类名” 称为类头,花括号中的部分称为类体,类体中定义了类成员表。

public  protected  private是三种重要的访问修饰符,它们用于控制类成员的访问权限:

  1. public(公共):public可以被类的任何外部代码访问。这意味着,无论是同一个文件中的其他函数,还是其他文件中的代码,只要能够访问到该类的对象,就能访问其public成员。

  2. protected(受保护):protected成员只能被当前类及其派生类(子类)的成员函数访问。这提供了一种机制,使得某些成员可以在类的内部和继承层次结构中被更广泛地使用,而不会被类的外部直接访问。

  3. private(私有):private成员只能在当前类内部访问,包括该类的成员函数和其他private成员。这种限制确保了对象的某些部分只能通过类提供的公共接口(通常是public成员函数)来访问,从而实现了封装和数据隐藏。

2、对象的创建与使用

int main() {
    // 创建一个学生对象
    Student student1("Alice", 20, "S12345");

    // 获取并打印学生详情
    student1.getDetails();
   //直接打印ID
    cout << "Student ID: " << student1.student_id << endl;
    return 0;
}

 上述代码创建了Student类的一个对象student1同时为它分配了属于它自己的存储块,用来存放数据和对这些数据实施操作的成员函数,对象只在定义它的域内有效。

3.C++对象模型 

各对象的内存分为:安放成员数据的数据区和安放成员函数的代码区,他们拥有独立的数据区,但代码区是公共的,这样做大大节省了内存。

(四)this指针

对于同一类的不同的对象,编译器在执行成员函数时,是如何知道处理的是哪个对象的数据的?

编译器对程序员自己设计的类型分为三次编译:

1.识别和记录类体中属性的名称,类型和访问限定,如属性在类体中的类型无关,如Student的ID。

2.识别和记录类体中函数原型(返回类型+函数名+参数列表),形参的默认值,访问限定,但不识别函数体。

3.改写在类中定义函数的参数列表和函数体,改写对象调用成员函数的形式。

class Int
{
private:
	int val;
public:

	void SetVal(int x) 
	{
		this->val = x;
	}
	int GetVal() const
	{
		return val;
	}
};

改写后会成为:

void SetVal(int x)       // 在编译时会改写为:void SetVal(Int * const this , int x)   

int GetVal() const        // int GetVal(const Int * const this ) 

(五)构造函数与析构函数

构造函数是一种特殊的成员函数,用于初始化对象。当创建类的实例(对象)时,构造函数会自动被调用。

特点:

  1. 构造函数的名称与类名相同。

  2. 构造函数没有返回类型,即使是void也不写。

  3. 构造函数在创建对象时自动调用,无需手动调用。

  4. 一个类可以有多个构造函数,这些构造函数可以有不同的参数列表,以实现不同的初始化方式。

  5. 构造函数可以使用初始化列表来初始化成员变量,这是一种更高效的初始化方式。

class Int
{
private:
	int val;
public:
	Int()//都带有this指针 无返回类型,有返回值,返回值就是它自己
	{
		val = 0;
		cout << "call Int()" << endl;
	}
	Int(int x )
	{
		val = x;
		cout << "call Int(int x)" << endl;
	}
	
};

构造函数的用途:1.创建对象  2.初始化对象中的属性  3.类型转换。

类型转化的例子:

int main()
{

	int x = 10;
	Int a(20);
	a = x;//先Int x(10),赋给a后,x析构掉   (必须是单参)
	return 0;

}

析构函数是另一个特殊的成员函数,用于释放对象占用的资源。当对象的生命周期结束时(例如,对象离开作用域或被显式删除),析构函数会自动被调用。

特点:

  1. 析构函数的名称是类名前加上波浪号(~)。

  2. 析构函数不接受任何参数。

  3. 析构函数没有返回类型,即使是void也不写。

  4. 析构函数在对象的生命周期结束时自动调用,无需手动调用。

  5. 析构函数可以是虚函数,这在处理基类指针指向派生类对象时非常重要。通过将基类的析构函数声明为虚函数,可以确保在删除基类指针时调用正确的析构函数(即派生类的析构函数)。

    class Int
    {
    private:
    	int val;
    public:
    	Int()//都带有this指针 无返回类型,有返回值,返回值就是它自己
    	{
    		val = 0;
    		cout << "call Int()" << endl;
    	}
    	Int(int x )
    	{
    		val = x;
    		cout << "call Int(int x)" << endl;
    	}
    	~Int()//无返回类型,有返回值,返回值是地址
    	{
    		cout << "Desroy" << endl;
    	}
    
    };

标签:析构,函数,对象,成员,C++,int,面向对象编程,构造函数
From: https://blog.csdn.net/2301_77458190/article/details/144066192

相关文章

  • C++ : 五、面向对象编程(2)
    (一)对象的生存期1.对于局部定义的对象,当程序控制流到达该对象定义处时,调用构造函数,程序控制走出该局部域时,调用析构函数。2.对于静态局部定义的对象,当程序控制流到达该对象定义处时,调用构造函数,整个程序结束时时,调用析构函数。voidfun(){ Complexc1(11,12); staticCom......
  • C/C++ 删除字符串中重复的字符并排序算法详解及源码
    删除重复字符算法详解及代码思路创建一个数组,默认所有元素都是0;遍历字符串的每个字符;判断当前字符是否已经出现过,如果没有出现过,则将数组中对应位置设为0,如果当前字符已经出现过,则将数组中对应位置设为1;遍历数组把值为0对应位置的字符加入到结果字符串中;返回结果字符串。代......
  • C++ 学习笔记(3):引用和指针
    前言前几天问GPT问的,单独拎出来当作笔记的一个补充吧。指针的基本概念指针(Pointer)是一个变量,它存储的是另一个变量的内存地址。在C++中,定义一个指针变量时使用*符号,这个符号并不是表示解引用,而是表示这个变量是一个指针变量,指向某种类型的数据。例子inta=5;int*p......
  • [2024年3月10日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(6))
    参考程序:#include<bits/stdc++.h>usingnamespacestd;intn;inta[305];intdp[305][305];//打掉ij之间所有靶子可以获得的最大积分(不含i,j)intmain(){cin>>n;for(inti=1;i<=n;i++){cin>>a[i];}a[0]=1;a[n+1]=1;for(inti=n......
  • c++什么是函数重载? 函数重载的实现原理是什么?
    函数重载在同一个作用域内,函数名字相同,参数(个数,顺序,类型)不同,那么就是函数重载voidfun(){cout<<"没有参数";}voidfun(inta){cout<<"int";}voidfun(inta,floatb){cout<<"intfloat";}函数重载和返回值没关系intfun(){cout<<"wu&......
  • 游戏防检查之C++鼠标轨迹算法 - 模拟人工轨迹
    一.简介鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。鼠标轨迹算法具有以下优势:模拟人工轨迹:算法能够模拟出非贝塞尔曲线......
  • C++代码覆盖率工具原理
    C++代码覆盖率工具通常不会进行反汇编操作。代码覆盖率工具的工作原理主要是通过插桩(Instrumentation)来实现的。在编译阶段,编译器会在代码中插入额外的代码来记录程序执行时的行为,包括哪些函数被调用、哪些分支被执行等。这些信息在程序运行时被收集,并在运行结束后用于生成覆盖......
  • (2024最新毕设合集)基于python的医疗用品管理平台-35382|可做计算机毕业设计JAVA、PHP、
    摘要本论文主要论述了如何基于Python开发一个医疗用品管理平台,本系统将严格按照软件开发流程进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,作者将论述医疗用品管理平台的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。......
  • 2016 GC小甲(C++)
    A.数字塔(2016GC小甲2)DescriptionFJ农场里每一只奶牛的脖子上挂着一个胸牌,胸牌上面印着一个倒三角数字塔,例如奶牛Bessie脖子上的胸牌印着:749321325457921你发现什么规律了吗?除了第一行的数字外,其他行的数字都等于其正上方的数字 + 其右上方数字的和,再除以10之后的......
  • C++字符串函数
    两种字符串定义(C++):字符串变量字符数组定义stringstr;charstr[100];求长度str.length();/str.size();strlen(str);输入字符串getline(cin,str);可以读入一行字符串,可以包含空格,遇到回车结束/cin>>str;可以读入一连串的字符,遇到空格or回车结束/scanf("%s",&......