C++之易混淆知识点二
1、数据抽象与封装
数据抽象是一种接口和实现相分离的编程技术,设计者关心的是如何实现这些接口,而使用者仅仅知道这些接口,抽象地考虑这些接口做什么的就可以了,不必去考虑如何实现这一层次。
封装是将低层次的元素结合起来组成高层次的实体,比如函数是封装的一种形式,函数本身可以看做一个大的实体,封装了函数里面所执行的实现细节,于是被封装的元素隐藏了他们的实现细节,可以通过调用该函数 来执行函数封装的功能,但不能直接访问函数所执行的语句。同理,类也是一个封装的实体,类是许多成员的大集合,隐藏了实现该类类型的成员。
标准库类型vector在使用的时候只考虑它能执行的操作,即值考虑接口,所以具有抽象特性,同时外部又无 法了解和访问该类型是如何实现其细节的,所以又具有封装特性。但是数组就不一样了,用户可以通过访问数 组的内存来直接对数组进行操作,所以虽然数组的定义类似于vector,但数组既不具有抽象特性,也不具有封装特性。
2、类的复制构造函数与默认构造函数
在类中是否需要显示定义类的复制构造函数,就看在进行类的对象复制的时候是否就相当于复制对象的所有数据成员,如果不是,就需要显示定义复制构造函数。因为隐式的复制构造函数是按照值进行复制的,因此,对于data成员的隐式复制完成之后,两个对象的data成员将指向相同的内存地址,在销毁的时候,会被释放两次。
class string
{
public:
string();
string(const string *str);
string & operator=(const string *str);
~string();
private:
char *data;
}
所以常常是类中有指针成员时,要求定义复制构造函数。
例如:string str1; //调用的是默认构造函数
string str2(str1); //调用的是copy构造函数
str1=str2; //调用的是赋值操作符
string str3=str1; //调用了copy构造函数、赋值操作符
copy构造函数与赋值操作符很容易混淆,但同时也很容易区分,有新对象产生的时候调用的一定是构造函数,如上述的string str3,如果没有定义新对象,如上述的str1=str2,就不会有构造函数被调用,调用的是赋值操作。
3、要考虑用重载以避免隐含的类型转换
比如:在字符串类String,class String{...},要进行比较,
bool operator==(const String &,const String&)
{
//代码中某处有下面的语句
if(caseOfString=="mingzi")
{...}
}
很明显,"程序中就相当于if(caseOfString==String("mingzi")),而我们只是为了读取"mingzi",而没有必要去复制。所以要用重载以避免转换,如
bool operator==(const String &str,const char *str1),bool operator==(const char *str1,const String &str)。
C++之易混淆知识点二的更多相关文章
- Java-web易混淆知识点整理
Java-web易混淆知识点 post和get区别 post: 数据不会显示在地址栏 安全 大小无限制 可以提交二进制文件 get: 数据显示在地址栏 不安全 get方式提交有大小限制(约4kb) 相 ...
- php易混淆知识点
一.define(“constant”, “hello world”);和const constant = “hello world”;的区别? (0).使用const使得代码简单易读,const本 ...
- 【PMP】易混淆知识点
一.混淆概念 德尔菲技术 德尔菲技术是组织专家达成一致意见的一种方法.项目专家匿名参与其中.组织者使用调查问卷就重要的项目议题征询意见,然后对专家的答卷进行归纳,并把结果反馈给专家做进一步评论.这个过 ...
- C++易混淆知识点整理
// 1 /////////////////////////////////////////////////////////////////////// // 常量指针:,指针可修改,变量不可修改(只 ...
- C语言之数组与指针的易混淆知识点
一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容 ...
- C++之易混淆知识点五
一.解析类继承中父类与子类之间成员的访问可见度: 外部可见度:指的是被子类继承的父类成员在子类的外部访问控制度,有protected.public.private. 内部可见度:指的是被子类继承的父类 ...
- C++之易混淆知识点四---虚函数与虚继承
C++面向对象中,虚函数与虚继承是两个完全不同的概念. 一.虚函数 C++程序中只要类中含有虚拟函数,编译程序都会为此类生成一个对应的虚拟函数跳转表(vtbl),该虚拟函数跳转表是一个又若干个虚拟函数 ...
- C++之易混淆知识点三---算法分析
最近复习算法,感到有一丝丝忘记的困惑,赶紧记下来... 一.分治法 分治法的思想就是“分而治之”,很明显就是将规模比较庞大.复杂的问题进行分治,然后得到多个小模块,最好这些小模块之间是独立的,如果这些 ...
- C++之易混淆知识点一-----static详解
1.const.mutable与volatile的区别:const表明内存被初始化以后,程序将不能对它进行修改.volatile则表明,即使程序代码没有对内存单元进行修改,但是里面的值也可能会发生变化 ...
随机推荐
- 5.listview(QStringList QStringListModel)
UI mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include < ...
- springboot的常见配置
1.Springboot热部署 热部署的意思就是当任何类发生改变时,通过JVM类加载的方式加载到虚拟机上,这样就不需要我们重启Application类了 做法: 1)添加一个依赖到pom.xml上: ...
- BZOJ 1806 DP
思路: f[i][a][b][c][d] 表示在第i天 昨天1矿吃的是a 前天1矿吃的是b 昨天2矿吃的是c 前天2矿吃的是d 的最优解 暴力转移 哦 需要优化一下空间- 变成i%2 就好了 //By ...
- POJ 2665 模拟,,
It is confirmed that these sections do not overlap with each other. 一句话 就变成水题了,,, // by SiriusRen #i ...
- windows下Keras框架搭建
1. 安装Anaconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ conda info来查询安装信息 conda list可以查 ...
- JS自定义功能函数实现动态添加网址参数修改网址参数值
无论是前端开发还是后台设计,很多时候开发人员都需要获取当前或目标网址的相关信息.这个已有现成的内置对象属性可以直接调用了(下面是获取当前页面的参考代码) 复制代码 代码如下: <script t ...
- UVALive-8078 Bracket Sequence 简单dp
题目链接:https://cn.vjudge.net/problem/UVALive-8078 题意 括号序列T是这样定义的: T是个空的 T是(T), {T}, 或者 [T] T是两个T组成的,比如 ...
- ArcGIS探索
一.ArcGIS10概述 1.1 总览 ArcGIS是地理信息系统平台软件,主要用于创建和使用地图,编辑和管理地理数据,分析和共享地理信息,并在一系列应用中使用地图和地理信息. 功能定位: a.地图: ...
- [luogu] P4040 [AHOI2014/JSOI2014]宅男计划(贪心)
P4040 [AHOI2014/JSOI2014]宅男计划 题目背景 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY不得不依靠叫外卖来维持生计. 题目描述 外卖店一共有N种食物, ...
- hbase的hbase-site.xml配置文件
<property> <name>hbase.rootdir</name> <value>hdfs://server110/hbase</valu ...