C++类中的常见函数。

#@author:       gr
#@date:         2015-07-23
#@email:        forgerui@gmail.com

一、constructor, copy constructor, copy assignment, destructor

1. copy constructor必须传引用,传值编译器会报错

2. operator= 返回值为引用,为了连续赋值

3. operator=需要进行自赋值判断

4. copy constructor, operator= 都需要调用子类的相应拷贝函数

5. operator=可以用copy constructor构造一个临时对象保存副本

6. destructor如果是基类,应该声明virtual

7. copy constructor对传进来的同类型对象的私有成员也有访问权限

private的限定符是编译器限定的,因为在类函数中,类私有成员变量是可见的,所以可以访问同类型私有成员。这个性质是针对所有类成员函数,不局限于构造函数。

class Widget {
private:char* name;int weight;static int counts;                  //需要在类外进行初始化
public:Widget(char* _name, int _weight) : name(new char[strlen(_name)+1]), weight(_weight) {   //初始化列表++counts;strcpy(name, _name);}Widget(const Widget& lhs) : name(new char[strlen(lhs.name)+1]), weight(lhs.weight) {    //参数是引用类型++counts;strcpy(name, lhs.name);}Widget& operator= (const Widget& lhs) {if (this == &lhs) {return *this;}Widget widTemp(lhs);        //临时对象char* pName = widTemp.name;widTemp.name = name;        //将被析构释放name = pName;++counts;return *this;               //返回引用}virtual ~Widget() {             //基类析构声明为虚函数--counts;                   //静态变量减1delete[] name;              //释放指针}
};class Television : public Widget {
private:int size;
public:Television(char* _name, int _weight, int _size) : Widget(_name, _weight), size(_size) {}Television(const Television& lhs) : Widget(lhs), size(lhs.size){}Television& operator= (const Television& lhs) {if (this == &lhs) {             //判断自赋值return *this;}size = lhs.size;Widget::operator=(lhs);         //调用子类return *this;                   //返回引用}~Television() {}
};

二、operator+,operator+=

1. operator+需要返回const值传递

2. operator+= 需要返回引用,可以进行连续赋值

3. operator+ 可以调用operator+=实现

class Widget{
public:const Widget operator+ (const Widget& lhs) {        //返回const值Widget tempWidget(*this);tempWidget += lhs;                  //调用+=实现return tempWidget;}   Widget& operator+= (const Widget& lhs) {        //返回引用weight += lhs.weight;return *this;}
};

三、operator++ 前置、后置

1. 前置方式要返回引用

2. 后置方式返回值const,避免a++++形式出现

3. 为了区分两者,后置方式加一个int参数

4. 后置方式调用前置方式实现

class Widget {
public:const Widget operator++(int) {          //返回const值,添加一个int参数Widget tempWidget(*this);++*this;                            //调用++实现return tempWidget;}Widget& operator++() {                  //返回引用weight++;           return *this;}
};

四、operator()

operator()一般可以实现函数对象,还可以用来模拟实现Matrix的元素获取。

函数对象需要实现operator(),使一个对象表现得像一个函数。

struct Compare: public binary_function<Widget, Widget, bool> {
public:bool operator() (const Widget& rhs, const Widget& lhs)const {return rhs.weight < lhs.weight;}
};Widget a("a", 1);
Widget b("b", 2);
//下面使用Compare形式像函数
std::cout << Compare(a, b) ? "a < b" : "a >= b" << std::endl;

转载于:https://www.cnblogs.com/gr-nick/p/4753133.html

### C++总结-[类成员函数]相关推荐

  1. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  2. C++类成员函数重载问题

    C++类成员函数重载问题 #include <iostream> using namespace std; class A {private: int a;int b; public:A( ...

  3. 类成员函数指针的语法

    /*类成员函数指针的语法*/ /*****************************类.h文件************************************/ #if !defined ...

  4. 10.2 运算符重载函数作为类成员函数和友元函数

    Complex operator+(Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; ...

  5. 类成员函数作为函数参数/回调函数 出现error C3867

    转自:https://blog.csdn.net/liyunxin_c_language/article/details/83188176 类成员函数作为函数参数出现error C3867:非标准语法 ...

  6. linux线程创建 类函数吗,linux多线程创建时使用类成员函数作为参数

    实际上所有线程都是用来处理C函数的,而不是C++类成员函数.标准库中提供一个API函数,这个函数以回调函数指针作为线程的执行代码并在单独的线程中调用回调函数.问题是在这样的线程库中不能创建执行对象成员 ...

  7. 【面试】编译器为我们实现了几个类成员函数?(c++)

    #include <cassert> #include <complex> #include <iostream>class Empty{};Empty e; Em ...

  8. 如何让API回调你的VC类成员函数而不是静态函数

    首先需要包含一个由yzwykkldczsh同志编写的模板类-----万能多用自适应无限制回调模板(为纪念友人fishskin,此模板又称为H>W模板) /******************** ...

  9. C++中空指针调用类成员函数的原理

    有下面的一个简单的类: class CNullPointCall { public:     static void Test1();     void Test2();     void Test3 ...

最新文章

  1. ssl证书是由什么组成?ssl证书是什么?
  2. 【设计模式】装饰者模式
  3. 要求输入框里面必须同时含有字母,数字,特殊字符,且不小于8位
  4. CMD安装/删除服务
  5. android 安全学习从何入手?
  6. 半监督语义分割方法汇总(附代码分析)
  7. qt调用SSDP协议
  8. c语言如何让图片置顶,UIView完全置顶的方法
  9. 记一次虚拟机也模拟器齐开被自己坑的经历
  10. 一个海量在线用户即时通讯系统(IM)的完整设计
  11. jmeter压力测试报告—模板
  12. 【bat/batch】bat中的转义字符
  13. 优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
  14. ScannerException: while scanning for the next token found character ‘@‘ 问题解决
  15. 关于AC6003、6005、6605版本关联WIFI6代产品方法
  16. 数学之美:维特比和维特比算法
  17. 10000+门店的蜜雪冰城,帮你找回软件赚钱的初心
  18. python频次统计图_数据分析师如何自力更生统计用户行为频次?
  19. 创建一个数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)
  20. squid SwitchyOmega 实现浏览器代理切换

热门文章

  1. 数据增强 数据集扩充_数据扩充的抽象总结
  2. 分类算法——K近邻算法及其R实现
  3. 代码review工具:Review Board
  4. sublime同步配置和插件
  5. 房贷利率上浮30%利息太高吃不消,如何让利率变成下浮10%?
  6. c语言grade d10,《电子技术10级C语言课程设计报告书写规范》.doc
  7. vue slot scope使用_20、slot插槽的用法
  8. linux禁止切换到root,linux禁止普通用户切换至root用户的实例讲解
  9. linux 下停止监听程序,Linux下启动Oracle服务和监听程序步骤
  10. b树索引 java_B树索引最通俗易懂的介绍