绿小蕤

好逸恶劳,贪生怕死

  • 主页
  • 简介
  • 相册
所有文章 友链 学习履历

绿小蕤

好逸恶劳,贪生怕死

  • 主页
  • 简介
  • 相册

剑指offer(一)

2018-08-22 2018-08-22 view 39 times

面试题一:赋值运算符函数

1
2
3
4
5
6
7
8
9
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
private:
char* m_pData;
};


构造函数

没有返回值

构造函数的重载


析构函数

没有传入参数、没有返回值、一个类只能有一个析构函数

先构造的对象,后析构


拷贝构造函数

根据一个类的对象,复制一个一样的对象

拷贝构造函数分为浅拷贝和深拷贝两种:

  • 浅拷贝只是复制指针的地址,会导致两个指针指向同一块内存,在分别delete时就会出现重复释放
  • 深拷贝则创建新内存,把值拷贝进新开的内存,指针指向新开的内存


赋值运算符函数重载

方法一:

  1. 返回值为类型的引用,函数结束前返回实例自身的引用 return *this

    若返回void,则不能做连续赋值操作 a=b=c

  2. 传入的参数为常量引用

    引用可以避免从形参到实参会调用一次拷贝构造函数,提高效率

    const 不改变传入的实例

  3. 重新分配内存时候,必须要释放之前自己已有的空间,否则会导致内存泄漏

    m_pData之前指向的内存释放

  4. 判断传入的参数和当前的实例*this是否为同一实例,即this == &str

    若是同一个,不进行赋值

1
2
3
4
5
6
7
8
9
10
CMyString& CMyString::operator=(const CMyString& str)
{
if(this=&str)
return *this;
delete []m_pData; //释放原有内存
m_pData=NULL;
m_pData=new char[strlen(str.m_pData)+1]; //分配新内存
stpcpy(m_pData,str.m_pData);
return *this;
}


方法二:

先释放之前的内存再开辟新空间,如果此时内存不足导致new时抛出异常,那么此时m_pData已经为空指针,原来实例的状态被修改,这样违背了异常安全性(Exception Safety)的原则

因可以先创建一个临时实例,再交换临时实例和原来的实例

1
2
3
4
5
6
7
8
9
10
11
12
CMyString& CMyString::operator=(const CMyString &str)
{
if(this !=&str)
{
//临时对象strTemp,运行到if作用域外,就用自动调用strTemp的析构函数从而完成了内存的释放
CMyString strTemp(str); //先创建一个临时对象strTemp
char* pTemp=strTemp.m_pData;
strTemp.m_pData=m_pData; //strTemp.m_pData就是实例的m_pData之前指向的内存
m_pData=pTemp;
}
return *this;
}

PS:内存泄漏—程序中己动态分配的堆内存,由于某种原因程序未释放,造成系统内存的浪费



以下是这道题涉及到的其它知识点


引用

  1. 引用是变量的别名,一旦把引用初始化为某个变量,就可以使用该引用名指向变量
  2. 引用与指针的区别:
    • 不存在空引用,引用必须连接到一块合法的内存
    • 一旦引用被初始化,就不能被指向到另一个对象,指针可以在任何时候指向到另一个对象
    • 引用必须在创建时被初始化,指针可以在任何时间被初始化


const

1. const修饰变量

const修饰的类型为TYPE的变量value是不可变的

1
const TYPE ValueName = value;


2. 指针使用const

(1) 指针本身是常量不可变

char* const pContent;

(2) 指针所指向的内容是常量不可变

const char* pContent;

(3)两者都不可变

const char* const pContent;


3. 函数中使用const

(1)const修饰函数参数
a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)

void function(const int Var);

b.参数指针所指内容为常量不可变

void function(const char* Var);

c.参数指针本身为常量不可变(也无意义,因为char* Var也是形参)

void function(char* const Var);

d.参数为引用,为了增加效率同时防止修改

void function(const Class& Var);//引用参数在函数内不可以改变

void function(const TYPE& Var); //引用参数在函数内为常量不可变

(2)const 修饰函数返回值


将const类型转化为非const类型的方法 :

const_cast < type_id > (expression)

  • C++

扫一扫,分享到微信

微信分享二维码
DLL的创建与使用
编译器、编辑器、IDE
  1. 1. 构造函数
  2. 2. 析构函数
  3. 3. 拷贝构造函数
  4. 4. 赋值运算符函数重载
    1. 4.1. 方法一:
    2. 4.2. 方法二:
  5. 5. 引用
  6. 6. const
    1. 6.1. 1. const修饰变量
    2. 6.2. 2. 指针使用const
    3. 6.3. 3. 函数中使用const
© 绿小蕤
访问量:45301次| 访客数:38802人次
版权属于绿小蕤
本喵出生 2592 天 18 小时 01 分
  • 所有文章
  • 友链
  • 学习履历

tag:

  • Advanced Technology
  • C++
  • cmake
  • Linux
  • 硬件
  • opencv
  • 区块链
  • 深度学习
  • python
  • 机器学习
  • Hexo
  • Git
  • 纪念第一篇文章
  • 计算机网络
  • tensorflow
  • 编译
  • 配置
  • 数据结构
  • caffe
  • cs144
  • cs231n
  • ubuntu
  • hexo
  • 计算机网络、密码学
  • 操作系统
  • 算法
  • 软件
  • 云

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • vim使用说明

    2019-10-07

    #Linux

  • 区块链

    2019-01-15

    #区块链

  • 密码学

    2019-01-15

    #计算机网络、密码学

  • caffe(九)——配置文件

    2019-01-10

    #caffe

  • caffe(八)——layer

    2019-01-10

    #caffe

  • caffe(七)——blob

    2019-01-10

    #caffe

  • TCP/IP HTTP Soket

    2019-01-08

    #计算机网络

  • 网页生成

    2019-01-07

    #计算机网络

  • yilia主题的相册搭建

    2019-01-07

    #hexo

  • 算法(二)——递归、迭代、回溯

    2019-01-06

    #算法

  • 算法(一)——时间复杂度

    2019-01-06

  • caffe(六)——可视化网络工具Netscope

    2019-01-04

    #caffe

  • caffe(五)——windows下输出log日志和画出accuracy和loss曲线

    2019-01-03

    #caffe

  • caffe(四)——finetune

    2019-01-03

    #caffe

  • caffe(三)——模型和数据集

    2019-01-02

    #caffe

  • 图神经网络

    2019-01-02

    #Advanced Technology#深度学习

  • caffe(二)——训练和测试MNIST

    2018-12-27

    #caffe

  • caffe(一)——windows下环境配置

    2018-12-27

    #caffe

  • Christmas Gift——pygame、pyinstaller

    2018-12-25

  • 机器学习(五)——KNN

    2018-12-25

    #机器学习

  • 机器学习(四)——XGBoost

    2018-12-25

    #机器学习

  • 机器学习(三)——PCA

    2018-12-24

    #机器学习

  • 机器学习(二)——贝叶斯算法

    2018-12-24

    #机器学习

  • 机器学习(一)——决策树、随机森林

    2018-12-24

    #机器学习

  • 编译和链接(四)——重定义

    2018-12-19

    #编译

  • 编译和链接(三)——头文件与库

    2018-12-19

    #编译

  • 编译和链接(二)——静态链接和动态链接

    2018-12-19

    #编译

  • 编译和链接(一)——预处理、编译、链接

    2018-12-19

    #编译

  • Linux(六)——进程调度

    2018-12-17

    #Linux

  • Debug、Release版本下 多线程问题

    2018-11-28

  • Dlib中imglab生成失败的解决方法

    2018-11-19

  • C++学习:多线程

    2018-11-08

    #C++

  • cs144:1-1

    2018-10-29

    #计算机网络#cs144

  • [置顶]目录检索

    2018-10-25

  • [置顶]分享

    2018-10-25

  • win10+VS2013+Dlib 安装配置

    2018-10-22

    #配置

  • C++学习:强制类型转换

    2018-10-21

    #C++

  • C++学习:const、static、extern

    2018-10-20

    #C++

  • C++学习:指针和引用

    2018-10-20

    #C++

  • C++学习:内存管理

    2018-10-19

    #C++

  • C++学习:C和C++的I/O库区别

    2018-10-19

    #C++

  • C++学习:内存对齐

    2018-10-19

    #C++

  • C++学习:类

    2018-10-19

    #C++

  • C++学习:标准库和标准模板库

    2018-10-19

    #C++

  • 操作系统启动过程

    2018-10-18

    #操作系统

  • 处理器

    2018-10-18

    #硬件

  • 远程登陆

    2018-10-17

  • 文本文件和二进制文件

    2018-09-20

  • CUDA和OpenCL

    2018-09-17

    #硬件

  • 2018-09-15

  • Linux(五)—— .o、.a、.so

    2018-09-13

    #Linux

  • CMake(三)—— Linux下使用CMake

    2018-09-13

    #cmake#Linux

  • ubuntu(三)—— opencv、cheese安装

    2018-09-13

    #Linux#ubuntu

  • ubuntu(二)—— sublime的python环境搭建

    2018-09-13

    #Linux#ubuntu

  • ubuntu(一)—— VM虚拟机上安装ubuntu

    2018-09-13

    #Linux#ubuntu

  • Linux(四)—— 文件

    2018-09-10

    #Linux

  • CMake(二)—— Windows下使用CMake

    2018-09-10

    #cmake

  • CMake(一)—— make和cmake

    2018-09-10

    #cmake

  • Linux(三)—— 环境变量

    2018-09-09

    #Linux

  • Linux(二)—— 系统目录结构

    2018-09-09

    #Linux

  • Linux(一)—— 为什么要用Linux做开发

    2018-09-09

    #Linux

  • DLL的创建与使用

    2018-09-04

  • 剑指offer(一)

    2018-08-22

    #C++

  • 编译器、编辑器、IDE

    2018-08-22

    #软件

  • VS+opencv的配置

    2018-08-19

    #编译#配置

  • opencv(六)——图像坐标系和宽高

    2018-08-15

    #opencv

  • opencv(五)——图像读取

    2018-08-15

    #opencv

  • opencv(四)——AdaBoost

    2018-08-14

    #opencv

  • opencv(三)——绘图

    2018-08-14

    #opencv

  • opencv(二)——imgproc

    2018-08-14

    #opencv

  • opencv(一)——HighGUI

    2018-08-14

    #opencv

  • cs231n笔记(十一)——生成式对抗网络

    2018-08-14

    #深度学习#cs231n

  • cs231n笔记(十)——反卷积与特征可视化

    2018-08-14

    #深度学习#cs231n

  • cs231n笔记(九)——分类、检测、分割、跟踪

    2018-08-13

    #深度学习#cs231n

  • 嵌入式与各种板子

    2018-08-05

    #硬件

  • Tensorboard 总结

    2018-08-05

    #python#tensorflow

  • TensorFlow 总结

    2018-08-05

    #python#tensorflow

  • cs231n笔记(八)——CNN经典网络

    2018-08-05

    #深度学习#cs231n

  • cs231n笔记(七)——深度学习框架

    2018-08-03

    #深度学习#cs231n

  • cs231n笔记(六)——循环神经网络

    2018-08-02

    #深度学习#cs231n

  • TensorFlow(四)——RNN实现MNIST的分类

    2018-08-02

    #python#tensorflow

  • NLP——word2vec

    2018-08-01

    #深度学习

  • TensorFlow(三)——两层CNN神经网络实现MNIST的分类

    2018-07-31

    #python#tensorflow

  • Ipython 与 Jupyter Notebook

    2018-07-29

    #python

  • TensorFlow(二)——单层神经网络实现MNIST的分类

    2018-07-26

    #python#tensorflow

  • TensorFlow(一)——两层神经网络预测线性回归

    2018-07-26

    #python#tensorflow

  • cs231n笔记(二)——最优化

    2018-07-26

    #深度学习#cs231n

  • 进程和线程

    2018-07-26

    #硬件

  • cs231n笔记(五)——卷积神经网络

    2018-07-25

    #深度学习#cs231n

  • cs231n笔记(四)——神经网络

    2018-07-18

    #深度学习#cs231n

  • cs231n笔记(三)——分段式反向传播求梯度

    2018-07-16

    #深度学习#cs231n

  • cs231n笔记(一)——线性回归、逻辑回归、多分类

    2018-07-15

    #深度学习#cs231n

  • 2018-07-15

  • 程序是怎样跑起来的

    2018-07-14

    #硬件

  • 解决pip安装慢的问题

    2018-06-28

    #python

  • Deep-Learning-吴恩达-作业(七)

    2018-06-28

    #深度学习#python

  • Deep Learning 吴恩达 课程笔记大纲

    2018-06-27

    #深度学习

  • Deep-Learning-吴恩达-作业(六)

    2018-06-25

    #深度学习#python

  • Deep-Learning-吴恩达-作业(五)

    2018-06-25

    #深度学习#python

  • Deep-Learning-吴恩达-作业——关于plot_decision_boundary()函数的理解

    2018-06-25

    #python#机器学习

  • Deep-Learning-吴恩达-作业(四)

    2018-06-24

    #深度学习#python

  • 深度学习和强化学习

    2018-06-21

    #机器学习

  • Deep-Learning-吴恩达-作业(三)

    2018-06-20

    #深度学习#python

  • Deep Learning 吴恩达 作业(二)

    2018-06-20

    #深度学习#python

  • Deep Learning 吴恩达 作业(一)

    2018-06-15

    #深度学习#python

  • anaconda,conda,pip的关系

    2018-06-13

    #python

  • 正则表达式

    2018-06-11

  • 机器学习算法回顾目录

    2018-06-05

    #机器学习

  • Cygwin 安装

    2018-06-01

    #Linux

  • Git 学习

    2018-06-01

    #Git

  • CryptoKitties

    2018-05-28

    #区块链

  • 2050大会——关于图像处理的收获

    2018-05-28

    #Advanced Technology

  • 虚拟机和云(特别简陋的认识)

    2018-05-18

    #云

  • 啥叫运营商

    2018-05-18

  • XML、YAML、JSON

    2018-05-14

    #数据结构

  • 傅里叶变换和图像处理

    2018-05-14

    #opencv

  • 机器学习算法大总结

    2018-05-11

    #机器学习

  • python入门编程

    2018-05-09

    #python

  • CommandLineParse类

    2018-05-08

    #opencv

  • argc和argv

    2018-05-08

    #C++

  • Hexo主题的优化

    2018-05-08

    #Hexo

  • ImageWatch

    2018-05-07

    #opencv

  • 天池比赛入门

    2018-05-07

    #机器学习

  • 编译器和解释器

    2018-05-04

    #编译

  • GitHub+Hexo 搭建自己的博客

    2018-05-04

    #Hexo

  • Hello GitHub

    2018-05-03

    #Hexo#纪念第一篇文章

  • 师兄的Blog
JZY

研究生:东南大学电子学院
本科:南京理工大学电光学院