zoukankan      html  css  js  c++  java
  • 返回 *this 的成员函数以及 const重载

    1.非常量成员函数返回非常量 *this,常量成员函数返回常量 *this,指向常量对象。

    2.重载函数必须参数数量或者类型不同吗?
    答案是:否。还存在一种const重载;
    Person.h
    
    #pragma once
    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    class Person
    {
        friend void printInfo(Person person);
    private:
        std::string name;
        std::string path;
        void do_display(std::ostream& ou)const { // 此处的const必不可少,否则常量函数无法调用
             ou << name << " " << path << std::endl;
        }
    
    public:
        Person() = default; // 让编译器自动创建一个默认构造函数
        Person(std::string name, std::string path):name(name),path(path){}
        
        std::string getName();
        std::string getPath();
    
        Person& setName(const string n)
        {
            this->name = n;
            return *this;
        }
    
        Person& setPath(const string p) // const 重载
        {
            this->path = p;
            return *this;
        }
    
        const Person& display(std::ostream& ou)const  // const 重载
        {
            do_display(ou);
            return *this;
        }
    
        Person& display(std::ostream& ou)
        {
            do_display(ou);
            return *this;
        }
    
        ~Person(){}
    };
    void printInfo(Person person);
    Person.cpp
    
    #include "Person.h"
    
    std::string Person::getName()
    {
        return this->name;
    }
    
    std::string Person::getPath()
    {
        return this->path;
    }
    
    void printInfo(Person person)
    {
        std::cout << person.name << " " << person.path << std::endl;
    }
    main.cpp
    
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include "Person.h"
    
    using namespace std;
    
    constexpr int f(int a)
    {
        constexpr int i = 2;
        //return i;
        return ++a;
    }
    
    struct ListNode {
        int val;
        ListNode* next;
    };
    
    
    int main()
    {
        const Person p1("qiang", "wei"); // 调用自定义构造函数
        Person p2; // 调用默认构造函数
        
        p2.setName("qiang").setPath("zhuang"); // 由于set函数返回 *this 引用,所以这行代码没错
        p2.display(std::cout); // 调用非常量版本的display
        p1.display(std::cout); // 调用常量版本的display
        
        printInfo(p2); // 友元函数 可以访问 类的私有成员
    }
  • 相关阅读:
    UVALive 7509 Dome and Steles
    HDU 5884 Sort
    Gym 101194H Great Cells
    HDU 5451 Best Solver
    HDU 5883 The Best Path
    HDU 5875 Function
    卡特兰数
    UVa 11729 Commando War 突击战
    UVa 11292 The Dragon of Loowater 勇者斗恶龙
    Spark Scala Flink版本对应关系
  • 原文地址:https://www.cnblogs.com/qiang-wei/p/12292562.html
Copyright © 2011-2022 走看看