您的位置:首页 > 其它

写一个类需要注意的一些要点

2017-07-09 18:42 417 查看
最初计划是写一个详细的知识笔记
后来觉得没有什么太大的比较,网上的资料以及书本知识都十分全面了,无需赘述
因此在此写下我觉得写一个类需要注意的地方
如有错误,欢迎指正
 
 
构建一个类
考虑其所包含的数据、以及要实现的操作(private、public、protected)
考虑类是否需要:构造函数(默认构造函数、拷贝构造函数、转化构造函数)、析构函数、赋值操作符、关系操作符重载(<<、>>、+=、+……)、
 
注意事项审核
1、
析构函数:是否需要虚析构?是否需要用到delete/delete[]?
2、
是不是每个构造函数初始化了所有成员呢?
3、
赋值操作符能正确地将对象赋给对象本身吗?是否需要if语句
4、
记得在复制构造函数和赋值操作付的类型参数中加上了const吗?
5、
如果函数有引用参数,它们应该是const引用吗?该函数是否应当具有改变数据的能力?
6、
操作符重载返回值是不是需要使用引用?
 
 
构造函数与析构函数
构造函数的名字与类名相同,析构函数的名字前面加个~符号,二者都没有返回值
提及需要注意的几点:
1、
如果自己已经定义了构造函数(无论何种类型),系统就不会为你生成默认构造函数,否则,系统会自动为你生成一个默认构造函数。
2、
构造函数建议使用初始化列表,更快一些。 函数名(形参):数据(形参),数据(形参){……}
注意:参数初始化顺序与初始化表列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。
3、
复制构造函数需要使用const引用:使用const是因为在转化时会经过一些变化转化成const之后再传到形参处,形参不是const,相当于从const传到非const是非法的;使用引用是假如不使用引用那么在实参传入形参时需要调用复制构造函数,形成了递归调用。
4、
析构函数注意是否释放了内存delete[]。new与delete要配套。
5、
注意深拷贝和浅拷贝,深拷贝就是不但指针复制了一份,指针指向的内容也复制了一份。
6、
声明explicit的构造函数不能进行隐式转换
 
 
 
赋值操作符、操作符重载this指针,类内重载、friend

赋值操作符、以及其他一些操作符的重载
1、
先判别需不需要重载这些操作符
2、
返回值为什么尽量是引用?两点原因。其一,输入流的对象是无法被拷贝的,而一旦返回非引用就要拷贝,所以就没办法编译通过了。
其二,当我们是(x=y)=z时便是逻辑上问题了。首先y赋给了x,但是由于返回的是非引用,所以z会赋值给一个临时变量而不是x;
3、
当不需要this指针时使用friend关键字。这时候要多传入一个参数
4、
在重载赋值操作符时使用if判断防止自赋值
5、
赋值操作符重载函数是不能够被继承的。如果我们没有写它,系统会默认一个赋值操作符重载,此时构成函数隐藏。
6、
this指针是一个const指针
istream& operator>>(istream&in, Frac& rhs)
 
 
 
静态成员变量与静态成员函数
它被关键字static修饰。
1、
静态成员是类的成员而不是类的实例的成员。
2、
static 成员变量必须在类声明的外部初始化,形式为:type class::name value;

3、
static 成员变量既可以通过对象来访问,也可以通过类来访问。但要遵循访问权限限制。不创建对象也可以通过类直接访问(singletong模式的关键一步)
4、
一个类中可以有一个或多个静态成员变量
5、
普通成员函数可以访问所有成员,静态成员函数只能访问静态成员。
6、
静态成员函数没有隐式的this指针
 
 
 
 
继承(三种继承的方法的区别),改变可见性使用using以及friend
 


图来自老师ppt

1、
在定义的类内部,三者是可以相互调用的
2、
private的东西是无法被继承的,即父类的private数据于操作在子类中无法使用。而private继承后,protected和public都变成了private也无法往下继承了
3、
继承中的名字遮蔽:基类和派生类的函数只要名字一样就构成遮蔽,不会因为参数不一样构成重载
4、
调用构造函数是从上而下调用。析构是相反的方向。
 
 
改变可见性就是使用using或者friend声明
friend声明:友元关系是单向的而不是双向的,A声明B是我的friend,不代表B认为A也是它的friend。友元关系不能传递。
 
 
const声明
1、
一旦将对象定义为常对象之后,就只能被常函数调用了。
2、
常函数需要在声明和定义的时候在函数头部的结尾都加上 const
关键字。
 
 
多态
多态分为运行时的多态和编译时的多态
1、
编译时的多态:函数模板、类模板
2、
运行时的多态:虚函数、动态绑定
3、
模板的书写:template <class T>
4、
虚函数:关键字virtual。在调用时设计向上类型转换会根据实际情况调用函数,不过仅限于指针和引用调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: