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则表明,即使程序代码没有对内存单元进行修改,但是里面的值也可能会发生变化 ...
随机推荐
- checkbox的使用总结
1 checkbox如何选中时显示内容,不被选中时隐藏内容 <!DOCTYPE html> <html> <head> <meta name="vi ...
- vue强制绑定css3的缩放效果transfrom:scale()
vue不提供 transfrom:scale(1.5) : 会报错 ,错误是 "TypeError: _vm.scale is not a function": 原因:Vue将其 ...
- GradientDrawable类的利用动态设置样式中的颜色
1.xml样式文件 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=& ...
- c#可自定义码表的base64加密解密算法类
000 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- WCF(二)配置文件
上篇文章中对WCF的配置放到App.config中,这样可以使程序更灵活.更具有扩展性. 下面说下配置文件中各个节点的含义. 服务端: WCF配置文件节点放在<system.serviceMod ...
- hdu 2795 Billboard 【线段树】
给出一个高为h,宽为w的广告板,有n张广告需要贴,从第一行开始贴,尽量靠左,输出每个广告最后贴在哪一行的 先一直想不通这样建树是为什么 后来看到一篇题解里面的一句话“直到找到一个满足条件的叶子节点” ...
- vim常用的基本命令
vim 常用的基本命令1. w [文件名] 相当于另存为2. r [文件名] 将[文件名]的内容加到光标行后面3. n1,n2 w[filename] 将n1到n2的内容保存为[file ...
- RocketMQ学习笔记(10)----RocketMQ的Producer 事务消息使用
1. 事务消息原理图 RocketMQ除了支持普通消息,顺序消息之外,还支持了事务消息. 1. 什么是分布式事务? 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同 ...
- 路飞学城Python-Day27(复习)
简单的socket通信 import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect( ...
- jq——html,text,val和对象访问
html代码 1.html():获取的是对象内的html代码,类似于innerHTML 2.html(代码):设置html的内容,替换 $("div").html("hh ...