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++之易混淆知识点二的更多相关文章

  1. Java-web易混淆知识点整理

    Java-web易混淆知识点 post和get区别 post: 数据不会显示在地址栏 安全 大小无限制 可以提交二进制文件 get: 数据显示在地址栏 不安全 get方式提交有大小限制(约4kb) 相 ...

  2. php易混淆知识点

    一.define(“constant”,  “hello world”);和const constant = “hello world”;的区别? (0).使用const使得代码简单易读,const本 ...

  3. 【PMP】易混淆知识点

    一.混淆概念 德尔菲技术 德尔菲技术是组织专家达成一致意见的一种方法.项目专家匿名参与其中.组织者使用调查问卷就重要的项目议题征询意见,然后对专家的答卷进行归纳,并把结果反馈给专家做进一步评论.这个过 ...

  4. C++易混淆知识点整理

    // 1 /////////////////////////////////////////////////////////////////////// // 常量指针:,指针可修改,变量不可修改(只 ...

  5. C语言之数组与指针的易混淆知识点

    一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容 ...

  6. C++之易混淆知识点五

    一.解析类继承中父类与子类之间成员的访问可见度: 外部可见度:指的是被子类继承的父类成员在子类的外部访问控制度,有protected.public.private. 内部可见度:指的是被子类继承的父类 ...

  7. C++之易混淆知识点四---虚函数与虚继承

    C++面向对象中,虚函数与虚继承是两个完全不同的概念. 一.虚函数 C++程序中只要类中含有虚拟函数,编译程序都会为此类生成一个对应的虚拟函数跳转表(vtbl),该虚拟函数跳转表是一个又若干个虚拟函数 ...

  8. C++之易混淆知识点三---算法分析

    最近复习算法,感到有一丝丝忘记的困惑,赶紧记下来... 一.分治法 分治法的思想就是“分而治之”,很明显就是将规模比较庞大.复杂的问题进行分治,然后得到多个小模块,最好这些小模块之间是独立的,如果这些 ...

  9. C++之易混淆知识点一-----static详解

    1.const.mutable与volatile的区别:const表明内存被初始化以后,程序将不能对它进行修改.volatile则表明,即使程序代码没有对内存单元进行修改,但是里面的值也可能会发生变化 ...

随机推荐

  1. flask-alembic数据迁移工具

    alembic是用来做ORM模型与数据库的迁移与映射.alembic使用方式跟git有点类似,表现在两个方面, 第一,alemibi的所有命令都是以alembic开头: 第二,alembic的迁移文件 ...

  2. 小数据量csv文件数据导入数据库(思路)

    大致写写思路,因为sqlserver提供了可以直接导入的图形界面. 1.private static string GetConnectionString(string folderPath)  // ...

  3. UNP学习笔记4——I/O复用:select和poll函数

    1 概述 之间的学习中发现,传统的阻塞式系统调用不仅浪费进程运行时间,而且会带来狠毒问题.因此进程需要有一种预先告知内核的能力,使得内核一旦发现进程指定的一个或者多个I/O条件就绪,它就通知进程.这个 ...

  4. LeetCode(94)Binary Tree Inorder Traversal

    题目如下: Python代码: def inorderTraversal(self, root): res = [] self.helper(root, res) return res def hel ...

  5. day07 分支,循环

    目录 if(分支) if的语法 if...else... if...elif...else if的嵌套 for循环 for-else 语句 for循环的嵌套(重要) range介绍 while循环 w ...

  6. 如何使用阿里云的yum源

    这里需要有网.因为我们需要下载会用到wget [root@localhost ~]# iptables -F[root@localhost ~]# systemctl stop firewalld[r ...

  7. SVG矢量动画

    一.概述 相较于png.jpg等位图通过存储像素点来记录图像,svg (Scalable Vector Graphics)拥有一套自己的语法,通过描述的形式来记录图形.Android并不直接使用原始的 ...

  8. 利用cookie判断文件下载完成

    在网页下载文件时,该文件又是通过后台代码生成的,比如报表之类的.当需要生成文件过大时会耗费很多时间,而文件生成好传到页面的时候也没有事件可以监听它,像微软官网,谷歌,百度等下载方式都是通过提示五秒过后 ...

  9. css——外部样式

    外部样式 先建立一个css文件,如下: 然后开始写代码,不要加<style> 然后可以在html文件中的<head>内引用:<link rel="stylesh ...

  10. Django Views Decorator

    Django的试图函数的装饰器主要有: HTTP请求方法 条件视图处理 GZip压缩 改变页眉 缓存 官网文档 HTTP请求方法 该装饰器是设置允许访问HTTP协议的方法,装饰器在django.vie ...