首页 > 其他分享 >第9章 类和对象

第9章 类和对象

时间:2024-05-30 16:12:11浏览次数:7  
标签:函数 对象 age Human 构造函数 声明 指针

1 类和对象

1.1 声明类

和变量、函数一样,类也需要声明。要声明类,可使用关键字class,并在其后依次包含

  • 类名
  • 一组放在{}内的成员属性和成员函数
  • 结尾的分号

类声明将类本身及其属性告诉编译器。类声明本身并不能改变程序的行为,必须使用类,就像需要调用函数一样

class Human
{
  //成员属性
  string name;
  int age;
  
  //成员函数
  void setAge();
}

通过关键字class,C++提供一种功能强大的方式,让我们可以创建自己的数据类型,并在其中封装属性和使用属性的函数(方法),类的所有属性以及在其中声明的函数都是类的成员。

封装是指将数据及使用它们的函数进行逻辑编组,这是面向对象编程的重要特征

1.2 对象

仅声明类并不会对程序的执行产生影响。要使用类的功能,通常需要创建其实例--对象,并通过对象访问成员方法和属性

1.3 访问对象成员

1.3.1 句点运算符(.)

句点运算符既可以用来访问对象属性也可以访问对象方法。

Human firstMan;
firstMan.age=26;
firstMan.setAge();

1.3.2 指针运算符(->)

如果对象是使用new实例化的,或者有指向对象的指针,则可使用指针运算符(->)来访问成员属性和方法:

Human* firstWoman=new Human();
firstWoman->name="Alice";
firstWoman->setAge();
delete firstWoman;

2 类的保护属性:public和private

C++可以将成员声明为公有的,这在有了对象后即可获取它们;也可以声明为私有的,意味着只能在类的内部({}之间声明的成员)或其友元中访问。
假如有这样一个类:

class Human
{
private:
  //私有成员数据
  string name;
  int age;
  
public:
  int getAge(){
    return age;
  }
  void setAge(int humansAge){
    age=humansAge;
  }
}

假如有一个名为eve的Human实例:

Human eve;

如果试图使用下述代码访问成员age:

cout<<eve.age;

将出现编译错误,要访问age的唯一途径就是通过Human类的公有方法getAge()。
保护属性可以让程序员决定要暴露哪些属性及如何暴露这些属性(比如在方法getAge()中,返回一个虚假的年龄)。

总之,C++让类的设计者能够控制类属性的访问和操作方式

3 构造函数

构造函数是一种特殊的函数,在根据类创建对象时被调用。

3.1 声明和实现构造函数

构造函数与类同名且没有返回值。构造函数既可以在类声明中实现(定义),也可以在类声明外实现。

类声明内实现:

class Human 
{
public:
  Human(){
    //构造函数代码
  }
};

类声明外实现:

class Human 
{
public:
  Human(); //构造函数声明
};

Human::Human(){
  //构造函数代码
}

::被称为作用域解析运算符。Human::age表示在Human类中声明的变量age,而::age表示全局作用域中的变量age

3.2 何时及如何使用构造函数

构造函数在创建对象时被调用,所以一般会在构造函数中初始化类成员变量。

可在不提供参数的情况下调用的构造函数称为默认构造函数。默认构造函数是可选的,如果声明类时没有提供默认构造函数,编译器将自动创建一个,这种构造函数会创建成员属性,但不会将POD类型的属性初始化为非零值。

3.3 重载构造函数

与函数一样,构造函数也可以重载,下面将创建一个将姓名作为参数的构造函数。

class Human 
{
public:
  Human(){
    //默认构造函数实现
  }

  Human(string humansName){
    //重载的构造函数实现
  }
};

当然也可以不实现默认构造函数,从而要求实例化对象时必须提供某些参数。没有默认构造函数并且类的设计者提供了重载的构造函数时,C++编译器将不会生成默认构造函数

3.4 带默认值的构造函数

构造函数也可以有带默认值的参数,用法和普通的带默认值函数一样。

class Human
{
private:
   int age;
   string name;

public:
//重载构造函数(没有默认构造函数)
   Human(string humansName, int humansAge = 25)
    {
      name=humansName;
      age=humansAge;
   }
};

实例化这个类时可以使用以下语法:

Human adam("Adam");
Human eve("eve",18);

默认构造函数是调用时可不提供参数的构造函数,而并不一定是不接受任何参数构造函数,下面的构造函数虽然有两个参数,但它们都有默认值,因此也是默认构造函数:

class Human
{
private:
   int age;
   string name;

public:
    //有两个参数的默认构造函数
   Human(string humansName=“Adam", int humansAge = 25)
    {
      name=humansName;
      age=humansAge;
   }
};

3.5 初始化列表

TODO...

4 析构函数

TODO...

5 复制构造函数

this指针

this指针是一个特殊的指针,它指向当前对象的实例,每一个对象都能通过this指针访问自己的地址。

this指针是一个隐藏的指针,可以在类的成员函数中使用,用来指向调用对象。当一个对象的成员函数被调用时,编译器会隐式地传递该对象的地址作为this指针。

友元函数没有this指针,因为友元函数不是类的成员,只有成员函数才有this指针

class Human
{
private:
  void Talk(string statement){
    cout<<statement;
  }
public:
  void introduceSelf(){
    Talk("bla bla");
  }
}

实际上,编译器在调用Talk时嵌入this指针,即Talk(this,"bla bla")

调用静态方法时,不会隐式传递this指针,因为静态函数不与类实例相关联,而由所有实例共享。要在静态函数中使用实例变量,应显示的声明一个形参,并将实参设置为this指针

标签:函数,对象,age,Human,构造函数,声明,指针
From: https://www.cnblogs.com/xdhisgood-xy/p/18188889

相关文章

  • 类与对象(中)
    目录​编辑一、类的6个默认成员函数二、构造函数2.1概念2.2特性三、析构函数3.1概念3.2特性四、拷贝构造函数4.1概念4.2特征五、赋值运算符重载5.1运算符重载5.2赋值运算符重载1.赋值运算符重载格式2.赋值运算符只能重载成类的成员函数不能重载成全......
  • 如何设计简单词法分析器 C++(面向对象)
    前言与其他教程不同,本文实现的词法分析器借鉴于C++输入流我搜过的教程基本上都是从状态转换的思想入手,虽然本文思路类似于状态转换,但也有独到之处。从面向对象的角度其他教程大多采用面向过程,二者都能解决问题,各有优劣。只不过我从面向对象的角度,给读者提供一个新......
  • Java 对象关系映射(ORM)框架:介绍Java的经典ORM框架,如Hibernate,MyBatis,及其用法
    什么是ORM对象关系映射(ObjectRelationalMapping,简称ORM)是一种程序设计技术,用于实现面向对象编程语言中的对象和关系数据库中的数据之间的映射。在其他words,它就是创建一个可在编程语言里使用的、能感知数据库模式结构的虚拟对象数据库。 ORM的主要作用如下: ......
  • JavaSE 面向对象程序设计 文件File 介绍练习加千行代码详解
    介绍在Java中,File类是用于表示文件和目录路径的抽象。它提供了一组方法来创建、删除、重命名、检查文件/目录的存在性、以及查询文件/目录的属性等功能。File类可以用于执行文件系统操作,如创建新文件、删除文件、检查文件是否存在等。目的是把字符串先表示为路径然后转化......
  • 在三维前端项目开发中THREE.PerspectiveCamera创建透视相机对象
    在Three.js中,可以使用THREE.PerspectiveCamera函数创建一个透视相机对象。大家好!艾斯视觉作为在IT行业中负责ui设计和前端开发环节的服务商很高兴能在这里与大家共同探讨学习:THREE.PerspectiveCamera的参数如下:fov:垂直视野角度,以角度为单位。通常,这个值在45到90之间。a......
  • for循环外创建一个http请求对象,循环内赋值参数多次请求返回数据相同定位及解决(共用一
    一次项目线上问题定位,发现多次不同参数请求值相同,直接上代码List<String>list=newArrayList<>();list.add("85657218,上海奉贤恒盛湖畔豪庭xxx号xxx");list.add("85657219,上海虹口虬江支路xxx弄xxx室");if(CollectionUtil.isNotEmpty(list))......
  • Java浅拷贝大揭秘:如何轻松复制两个不同对象的某些相同属性
    哈喽,大家好,我是木头左!一、引言在Java编程中,经常会遇到需要复制一个对象的属性到另一个对象的情况。这时,可以使用浅拷贝(ShallowCopy)来实现这个需求。那么,什么是浅拷贝呢?浅拷贝是指创建一个新对象,然后将原对象的非静态字段复制到新对象中。这样,新对象和原对象就会有相同的字段......
  • Python面向对象基础
    一、前言其实自己一直都觉得自己的编程代码能力是很垃圾的,事实也的确如此,算法算法不会,开发开发不会...今天和同学交流了一些代码。发现果然自己真的很菜啊。那就巩固一下基础吧.很久没碰,这都全忘了呀。二、类和对象什么是类,什么是对象。对象是类定义来的,类是无实际数据的。就是......
  • MetaObjectHandler探秘:了解对象元数据处理的奥秘
    前言大家好,我是Front_Yue,本篇文章将介绍springboot项目中操作数据时如何自动填充创建人,创建时间等公共字段。在MyBatis-Plus中,MetaObjectHandler是一个用于处理实体对象的元对象的接口。它允许我们在插入、更新、删除等操作之前或之后,对实体对象进行自定义处理。通过......
  • SQLServer2022新特性JSON_OBJECT从零个或多个表达式中构造JSON对象
    SQLServer2022新特性JSON_OBJECT从零个或多个表达式中构造JSON对象文本参考中文官方文档https://learn.microsoft.com/zh-cn/sql/t-sql/functions/json-object-transact-sql?view=sql-server-ver16参考英文文官方文档https://learn.microsoft.com/en-us/sql/t-sql/fun......