C++学习之路: class的this隐式指针讨论

class内部的成员函数是不需要把 自己的 privata元素传入的。因为系统已经通过this指针帮我们传入了。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

/*
 * 本例错误的原因是:set系列函数返回的是对象
 * 所以返回时产生了一个临时的对象
 */
class Student
{
    public:
        Student()
            :id_(0), name_(""), age_(0)
        {
            cout << "构造Student" << endl;
        }

        ~Student()
        {
            cout << "销毁Student" << endl;
        }

        Student setId(int id)
        {
            id_ = id;
            return *this;
        }

        Student setName(const string name)
        {
            name_ = name;
            return *this;
        }

        Student setAge(int age)
        {
            age_ = age;
            return *this;
        }

        void print(ostream &os) const
        {
            os << id_ << " " << name_ << " " << age_ << endl;
        }

    private:
        int id_;
        string name_;
        int age_;
};

int main(int argc, const char *argv[])
{
    Student s;
    s.setId(11).setName("zhangsan").setAge(88).print(cout);    //此处通过值拷贝返回了3个局部对象 {id_= 0, Name_ = "", age_ = 0}
    s.print(cout);                                             //传入给setId() 返回一个拷贝 ①{id_= 11, Name_ = "", age_ = 0}                                                                //传入给setName() 值拷贝返回一个局部对象②{id_= 11, Name_ = "zhangsan", age_ = 0} 
                                                               //传入给setAge() 值拷贝返回一个局部对象③{id_= 11, Name_ = "zhangsan", age_ = 88} 
                                                               
return 0; }
构造Student
11 zhangsan 88
销毁Student
销毁Student
销毁Student
11  0
销毁Student

//结果打印了销魂了3个局部变量

综上,如果不通过返回引用的方式return s,成员函数其实返回的是一个拷贝的副本, 上面我们已经分析过了一共调用了3次成员函数,共返回了3个局部对象, 它们的作用域,是相继屏蔽的。

作用域的知识可以参考c与指针、

时间: 2024-11-08 21:53:46

C++学习之路: class的this隐式指针讨论的相关文章

C++学习之路: 左值&amp;右值 的讨论

本章我们讨论一下左值和右值, 剔除我们在学习C语言时养成一些错误常识. 先上代码 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 6 //在c++98中,变量分为左值和右值,左值指的是可以取地址的变量,右值指的是非左值.二者的根本区别在于能否获取内存地址,能否赋值不是区分的依据. 7 8 //根据这个原则 我们尝试给以下2个变量和2个表达式 取地址 9 string one("one

显示动画,隐式动画、关键帧动画

概要 一些简单的动画代理学习例子,包括显示.隐式.关键帧.关键帧路径四类动画.(感觉这个动画太复杂,学习简单的例子没继续了) 结果展示 流程概要 见代码 主要代码 // // ViewController.m // Animation // // Created by arbboter on 14/12/20. // Copyright (c) 2014年 arbboter. All rights reserved. // #import "ViewController.h" @int

Android学习之路——Android四大组件之activity(一)

一.什么是Activity? Activity简单的说就是一个界面,我们在Android手机上看到的每一个界面就是一个activity. 二.Activity的创建 1.定义一个类继承activity,然后在清单文件manifest.xml文件的application节点下注册activity,这个activity就创建成功了. public class MyActivity extends Activity { } 2.清单文件注册activity <application android:a

LTE学习之路(8)——信令流程

1 在LTE中,需要识别3个主要的同步需求 符号和帧定时的捕获,通过它来确定正确的符号起始位置(如设置DFT窗位置): 载波频率同步,需要它来减少或消除频率误差的影响(注:频率误差是由本地振荡器在发射端和接收端间的频率不匹配和UE移动导致的多普勒偏移造成的): 采样时钟的同步 2 两个物理信号 主同步信号(PSS,Primary Synchronization Signal) 和辅同步信号(SSS,Secondary Synchronization Signal) 注:对于这两个信号的检测,不仅

java学习之路之javaSE基础1

<h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解)* A:什么是计算机?计算机在生活中的应用举例 * 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件和软件所组成,没有安装任何软件的计算机称为裸机.常见的形式有台式计算机.笔记本计算机.大型计算机等. * 应用举例 * 1:科学计算 * 2.数据处理 * 3.自动控制 *

Azure云平台学习之路(三)——Cloud Services

1.什么是云服务? 能够部署高度可用的且可无限缩放的应用程序和API.简而言之,就是你写的CMD程序按照一定的框架进行少量修改就能运行在Azure云平台上. 2.Azure云服务有什么特点? (1)专注应用程序而不是硬件,PaaS的一种. (2)支持多种框架和语言. (3)集成了运行状况监视和负载平衡. (4)自动缩放优化成本和性能 3.建立云服务之前,我们需要建立一个云存储,来记录我们的程序的日志信息(当然,这不是必须的) (1)选择左边导航栏的"存储".主面板上显示的是所有已有的存

linux学习之路之LVM

试想一种情况,当初我们在规划磁盘的时候,只给某一个磁盘或分区之划分了30G的容量,但是后来,随着业务的需求,该磁盘或者分区的使用量会越来越大,等到以后再有数据存放时,发现该磁盘或者分区的容量不够用,此时该怎么办了?可以新增一个磁盘,经过格式化,挂载等过程就可以使用这个磁盘了,再将原来磁盘的数据完全的复制过来.等到后来又发现,规划的磁盘又太大了,然后又使用上述方法来减少磁盘的大小.虽然这种方法可行,但是效率低,比较复杂.不应该是我们首选的方法. 当然,我们可以这样做,将多个磁盘或者分区(PV)组合

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

一个女大学生的代码学习之路(二)

首先说一下,写这种文章是由于我在四月四日晚上,在手动搭建自己的第一个ssh项目的时候,遇到了一个配置的问题,怎么解决也弄不好,当时是四号晚上九点,我看了一眼表,我就想两个小时之内,我要是能搞定就算行了,但是其实,我搞到三点才OK(凌晨),那时候已经是五号了,转天是一家子去扫墓的时候,结果我居然以这种一个理由没有去,理由是我太累了么?我只是就是搭了一个架子,就是由于我的包太混乱了,导致不兼容,所以tomcat总也不启动,你可能认为好笑,这么简单一个问题怎么就费这多多时间呢,但是作为一个刚接触三框架