### C++总结-[类成员函数]
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++总结-[类成员函数]的更多相关文章
- 重载运算符:类成员函数or友元函数
类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...
- C++类成员函数的重载、覆盖和隐藏区别?
C++类成员函数的重载.覆盖和隐藏区别? a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆 ...
- C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数
getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似.即 cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符) [例13.7] 用get ...
- C++的类成员和类成员函数指针
类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...
- python 类成员函数
http://cowboy.1988.blog.163.com/blog/static/75105798201091141521583/ 这篇文章总结的非常好 主要注意的地方是 1,在类内调用成员函数 ...
- C++:类成员函数的重载、覆盖和隐藏区别?
#include <iostream> class A { public: void func() { std::cout << "Hello" <& ...
- 理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)
我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以 ...
- 并发编程: c++11 thread(Func, Args...)利用类成员函数创建线程
c++11是VS2012后支持的新标准,为并发编程提供了方便的std::thread. 使用示例: #include <thread> void thread_func(int arg1, ...
- 直接调用类成员函数地址(用汇编取类成员函数的地址,各VS版本还有所不同)
在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法. ...
随机推荐
- 转载LINQ TO Entity 在数据库发生更改时更新实体数据模型 .edmx 文件
转载原出处:http://blog.csdn.net/litao2/article/details/8629335 在“模型浏览器”中,右击 .edmx 文件,然后选择“从数据库更新模型”. 模型更新 ...
- 原”zencart建站仿站俱乐部”现升级为”zencart 学院“!
特别告示: 原”zencart建站仿站俱乐部”现升级为”zencart 学院“!
- c++中类长度解析
通常我们定义一个类,它所占的空间有多大呢? 首先我们看一下下面的这个类 class A{ public: void func1(void){ printf("11111heihei\n&qu ...
- cocos2dx中android下动态更新.so文件
作者:HU 转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4037595.html 因为没用lua脚本写游戏,所以每次发布出去后,发现在bug,需要 ...
- iOS开发- 文件共享(利用iTunes导入文件, 并且显示已有文件)
实现过程: 1.在应用程序的Info.plist文件中添加Application supports iTunes file sharing键,并将键值设置为YES. - (void)viewDidLo ...
- 删除浏览器浏览器删除cookie方法
上班之余抽点时光出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下删除浏览器 文章目录导航 适用范围及演示工具 什么是cookie? cookie有什么作用? ie6/ie7/ie8 ...
- hdu 5465 Clarke and puzzle 二维线段树
Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- android自动打包方法(ant+proguard+签名)
前段时间做了一个android的网游项目,现在优化减少体积和防止别人反编译,需要把编译后.class进行混淆,开始在网上看了一些关于 ProGuard的介绍,基本上都是使用ADT自带的打包方式,那个打 ...
- iOS开发——开发技巧&Mac常用命令
现实和隐藏文件拓展名 显示:defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder 隐藏:def ...
- android学习日记22--Animation动画简介
Animation动画主要有两种:帧动画(Frame Animation)和补间动画(Tween Animation).补间动画主要包括对位置.角度.尺寸等属性的变化,而帧动画则是通过若干帧图片轮流切 ...