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. Property cannot be found on forward class object?

    I have a UIView and I'm trying to set its layer properties. self.colorSwatch = [[UIView alloc] initW ...

  2. [Objective-c 基础 - 2.10] description方法

    A. 实例对象打印-description 1.当使用NSLog函数并且使用%@占位符的时候,会调用对象的-description方法 2.拿到-description的返回值,显示到console中 ...

  3. github快速入门(一)

    一.github介绍 git是一款非常知名的代码托管工具.当然现在有了github for windows版本(类似于 svn tortoise). GitHub for Windows 是一个 Me ...

  4. 关于NoSQL数据库你应该知道的10件事

    关系数据库模型已经流行了几十年了,但是一种新类型的数据库——被称为NoSQL,正在引起企业的注意.下面是关于它的优势和劣势的一个概述.二十多年以来,对数据库管理来说,关系数据库(RDBMS)模型一直是 ...

  5. iOS stretchableImageWithLeftCapWidth 图片放大不变形

    转载自:http://www.cnblogs.com/bandy/archive/2012/04/25/2469369.html - (UIImage *)stretchableImageWithLe ...

  6. 【转】linux下cppunit的安装

    以下内容来自:http://www.51testing.com/html/51/279751-170160.html 1. 安装 cppunit的下载地址为:http://sourceforge.ne ...

  7. ThinkPHP CURD方法盘点:table方法

    table方法也属于模型类的连贯操作方法之一,主要用于指定操作的数据表. 用法 一般情况下,操作模型的时候系统能够自动识别当前对应的数据表,所以,使用table方法的情况通常是为了:切换操作的数据表: ...

  8. iOS开发——UI篇OC篇&UIDynamic详解

    iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...

  9. JQuery Mobile navbar动态刷新创建

    今天突然用到须要动态改变tab页, 布局代码例如以下: <div data-role="navbar" id='divtab'> <ul id='divtabul ...

  10. 读写锁ReaderWriterLockSlim

    读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁. 某些场合下,对一个对象的读取次数远远大于修改次数,如果只是简单的用lock方式加锁,则会影响读 ...