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; //静态变量减1
delete[] 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;

### C++总结-[类成员函数]的更多相关文章

  1. 重载运算符:类成员函数or友元函数

    类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...

  2. C++类成员函数的重载、覆盖和隐藏区别?

    C++类成员函数的重载.覆盖和隐藏区别? a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆 ...

  3. C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数

    getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似.即    cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符) [例13.7] 用get ...

  4. C++的类成员和类成员函数指针

    类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...

  5. python 类成员函数

    http://cowboy.1988.blog.163.com/blog/static/75105798201091141521583/ 这篇文章总结的非常好 主要注意的地方是 1,在类内调用成员函数 ...

  6. C++:类成员函数的重载、覆盖和隐藏区别?

    #include <iostream> class A { public: void func() { std::cout << "Hello" <& ...

  7. 理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)

    我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以 ...

  8. 并发编程: c++11 thread(Func, Args...)利用类成员函数创建线程

    c++11是VS2012后支持的新标准,为并发编程提供了方便的std::thread. 使用示例: #include <thread> void thread_func(int arg1, ...

  9. 直接调用类成员函数地址(用汇编取类成员函数的地址,各VS版本还有所不同)

    在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法. ...

随机推荐

  1. Go: using a pointer to array

    下面的不是指针指向数组,而是指针指向Slice I'm having a little play with google's Go language, and I've run into someth ...

  2. IOS获取摄像和本地中的资源

    上传文件时,我们都的从本地中选择或用相机来拍摄得到文件. 一个上传按钮,单击事件 1 -(IBAction)btnClick{ 2 UIActionSheet* actionSheet = [[UIA ...

  3. HTML超出文本多行截取代码

    HTML超出文本多行截取代码如下: HTML: <div class="sytm-text-1">      <p>           沈阳网页制作公司有 ...

  4. 【转】使用junit4进行单元测试(高级篇)

    转自:http://blog.csdn.net/andycpp/article/details/1329218 通过前 2 篇文章,您一定对 JUnit 有了一个基本的了解,下面我们来探讨一下JUni ...

  5. 【剑指Offer学习】【全部面试题汇总】

    剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...

  6. C 循环链表

    循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素 在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素. 1) 普通插入元素(和单链 ...

  7. C 二叉树

    二叉树表示法 P127页 /* typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTre ...

  8. dtrace4linux

    http://www.oschina.net/p/dtrace4linux?fromerr=ZSxqzDcE

  9. javascript调试 console

    Console命令详解,让调试js代码变得更简单   Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些 ...

  10. 生产者/消费者问题的多种Java实现方式--转

    实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的.在博文<一种面向作业流(工作流)的轻量级可复用 ...