c++定义成员函数

1.定义和声明成员函数的方式和普通函数差不多。成员函数的声明必须在类的内部,他的定义则即可以在类的内部也可以在类的外部。非成员函数的定义和声明都在类的外部。

struct Sales_data{std::string isbn() const { return bookNo; }double avg_price() const;std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;
};

2.成员函数通过名为this的额外的隐式参数来访问调用它的那个对象。

当我们调用一个成员函数时,用请求该函数的对象地址初始化this。

在成员函数内,我们可以直接使用调用该函数的对象的成员,无需通过成员访问运算符。因为this就相当于调用成员函数的那个对象。任何对类成员的直接访问都被看作this的隐式引用。

std::string isbn() const { return bookNo; }//成员函数的定义
total.isbn();//调用成员函数
//调用成员函数,实际上是在替某个对象调用它。isbn反回bookNo时,实际上它隐式反回total.bookNo。
/*
total.isbn()在编译时,编译器负责把total的地址传给isbn的隐式形参this
伪代码:Sales_data::isbn(&total)
this形参是隐式定义的,任何自定义名为this的参数或变量的行为都是违法的。
我们可以在成员函数体内部使用this。
std::string isbn() const {return this->bookNo;}
this总指向这个对象,所以this是个常量指针,不允许改变this中保存的地址。
*/

3.使用const修改隐式this指针的类型:

默认情况下,this的类型是指向类类型非常量版本的常量指针。在Sales_data成员函数中,this的类型是Sales_data *const。这就意味着,默认情况下,我们不能在一个常量对象上调用普通的成员函数(请参考参数传递)。与此同时由于在isbn()函数体内不会改变this所指对象,所以我们完全可以把this设置为指向常量的指针。有助于提高函数灵活性。

std::string isbn() const { return bookNo; }//紧跟参数列表后面的const表示this是一个指向常量的指针,这样使用const的成员函数被称作常量成员函数。//下面是伪代码,说明this指针是如何使用的,下面代码是非法的,因为我们不能显示定义this指针。这里的this是一个指向常量的指针,因为isbn是一个常量成员。
std::string Sales_data::isbn(const Sales_data *const this)
{return this->isbn;}

4.类的成员函数的定义嵌套在类的作用域之内。在类的外部定义成员函数时,要加上作用域运算符,表示该函数剩余代码是位于类的作用域内的。

struct Sales_data{std::string isbn() const { return bookNo; }double avg_price() const;std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;
};
double Sales_data::avg_price() const{if(units_sold)return revenue/units_sold;//隐式使用Sales_data成员elsereturn 0;
}

5.定义一个反回this对象的函数:

combine类似一个符合赋值运算符+=,total.combine(trans);trans相当于+=右侧运算对象,total相当于左侧运算对象。调用total.combine(trans)时,total的地址绑定到隐式的this参数上,rhs绑定到了trans上。

我们定义函数类似于某个内置运算赋时,应该尽量模仿这个运算符,内置的赋值运算符把他左侧运算对象当成左值返回,因此为了保持一致,combine函数必须返回引用类型。所以返回类型是Sales_data&

struct Sales_data{std::string isbn() const { return bookNo; }double avg_price() const;Sales_data& combine(const Sales_data&);std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;
};
Sales_data& Sales_data::combine(const Sales_data &rhs)
{units_sold += rhs.units_sold;//rhs成员加到this对象的成员上。revenue += rhs.revenue;return *this;//返回调用该函数的对象
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java拖动图片拼图_求教,我的这个拼图程序中的移动图片的改怎么做

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼public class button extends JPanel implements MouseListener, ActionListener {/****/private static final long serialVersionUID 1L;private JButton[] button;private ImageIcon[] puzzlep;private JButton kbbutton;priva…

c++函数返回值是一个引用

函数返回值是一个引用的情况: 1.值是如何被返回的: 返回的值用于初始化调用点的一个临时量,该临时量就是函数调用的结果。 如果函数返回引用,则该引用仅是它所引对象的一个别名。 2.不能返回局部对象的引用或指针:…

java视频压缩 lz4_一种视频序列帧的压缩方法、解压方法及装置与流程

技术特征:1.一种视频序列帧的压缩方法,其特征在于,包括:在视频帧数据压缩时,对解析到的第一帧视频帧数据使用lz4算法进行压缩并保存至视频文件中;对之后解析到的每一帧视频帧数据都与之前一帧视频帧数据进行…

c++ 构造函数

构造函数: 类通过一个或几个特殊的成员函数来控制其对象的初始化进程,这些函数叫构造函数。构造函数的任务是初始化类对象的数据成员。 构造函数名字和类名相同,构造函数没有返回类型。构造函数也有一个可能为空的参数列表和一个可能为空的…

js java post提交_如何从Express.js发送Post请求到另一个服务器(Java)?

小编典典您正在重复请求,并为发布请求重新分配变量。我已经更新了您的代码并与requestb.in一起对其进行了测试var express require(express);var querystring require(querystring);var http require(http);var app express();app.get(/, function (req, res) {…

c++ 访问控制与封装

访问控制与封装 文章目录访问说明符:友元:封装好处:class Sales_data{public://作为接口的一部分,构造函数和部分成员函数isbn,combine紧跟在public说明符之后。Sales_data() default;Sales_data(const std::string &…

c++ 命名空间的using声明

命名空间的using声明: 除了内置类型之外,c语言还定义了一个内容丰富的抽象数据类型库。 访问库中名字的一个简单方法就是通过using。 我们用到的库函数基本上都属于命名空间std,可以通过::(作用域操作符)从左侧作用…

mysql工作中遇到的问题_MySQL工作中遇到的问题记录

1:log_slave_updates:从库1搭建级联从库2,从库1需要开启log_slave_updates,修改/etc/my.cnf,增加一行log_slave_updates1,重启数据库。http://blog.itpub.net/12679300/viewspace-1319263/2:ERROR 1418 (HY…

java 基本格式

java基本格式: 所有的java程序必须放在一个类之中才可以执行。 主方法main是整个java程序的入口,所有程序都是从public static void main(String[] args)开始运行的。 类定义有两种形式: public class:文件名和类名一致。每一个*.java文件…

用java画海绵宝宝_java 方法的重载

方法的重载:一个类中允许出现一个以上的同名方法,必须保证同名方法的参数列表不同好处:方便阅读,优化程序设计重载规则:重载方法名相同,但每个重载方法都必须有一个独一无二的参数类型列表,方法…

Java 构造方法

Java构造方法: 通过构造方法,在对象最初被创建时就完成对其成员变量的初始化。 构造方法特点: 构造方法名称和类名相同。构造方法不返回任何数据,也不用void声明。在创建对象时,系统自动调用类的构造方法。构造方法…

ajax 链接java_如何使用ajax将下拉菜单链接到表

以下是实现您的功能的示例静态代码 . 您可以使用sql和php添加动态内容 .的index.phpCource 1Cource 2Cource 3Cource 4$("#courses").change(function(){var course $(this).val();$.post(data.php, {course: course}, function(response){// your drop down box is…

Java 作用域修饰符

Java作用域修饰符 在java语言中,可以使用访问修饰符来规定对类、变量、方法和构造方法的访问。 文章目录一、访问修饰符二、非访问修饰符一、访问修饰符 1.私有的访问修饰符private: 声明为私有访问类型的变量只能通过类中的公共方法被外部类访问。 …

python xgboost实战_史上最详细的XGBoost实战

0. 环境介绍Python 版 本: 3.6.2操作系统  : Windows集成开发环境: PyCharm1. 安装Python环境安装Python首先,我们需要安装Python环境。本人选择的是64位版本的Python 3.6.2。去Python官网https://www.python.org/选择相应的版本…

java web导入tomcat_记一次在服务器上导入javaweb 项目的经历---tomcat服务器-Go语言中文社区...

1. 导入数据库远程linux服务器mysql数据库导入和导出.sql文件大部分情况本地开发环境为windows,部署的服务器为Linux,本地数据库导出.sql文件后需要远程导入服务器,具体如下。首先连接服务器,即服务器ip,协议&#xff…

Java 创建对象

Java 创建对象 声明:Person p1; 声明一个对象,包括对象名称(p1)和对象类型(Person)。 实例化:p1 new Person(); 使用关键字new创建一个对象。 声明和实例化连起来可以写成:Person …

java 2d绘图 stroke_Java标准教程:Java 2D绘图--第4章使用Text

Java标准教程:Java 2D绘图--第4章使用Text本节介绍文本API的用法,以及他们的渲染能力。至今为止,您已经有了基本的Java 2D文本API,同时知道如何设置字体和位置,以及绘制文本。本节扩展了这些知识,同时更深入…

java 对象引用传递

java对象引用传递 引用传递也称为传地址,实际参数的引用(地址)被传递给方法中对应的形式参数,在方法中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数改变将影响实际参数。 传引用的数据…

java 定义和导入包

java定义和导入包: 为了更好地组织类,java提供了包机制。把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。同一个包中的类名不同,不同包中类名可以相同。同时调用两个不同包中相同类名的类时,应该加…

c++ int自动转换成无符号变量产生的问题

c int自动转换成无符号变量产生的问题 无符号对象不会小于零&#xff0c;尽管我们不会故意给无符号对象赋一个负值&#xff0c;但可能写出这样的代码。 1.当一个算数表达式中既有无符号数又有int值时&#xff0c;那个int值就会转换成无符号数。 #include<iostream> us…