(1)定义一个空的类型,里面没有不论什么成员变量和成员函数,对该类型求sizeof,得到的结果是多少?

答案是1。空类型的实例中不包括不论什么信息,本来求sizeof应该是0,可是当我们声明该类型实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。

至于占用多少内存。由编译器决定。

Visual Studio中每一个空类型的实例占用1字节的空间。

假设在该类型中加入一个构造函数和析构函数,再对该类型求sizeof,得到的结果又是多少?

答案还是1。调用构造函数和析构函数仅仅须要知道函数的地址就可以,而这些函数的地址仅仅与类型相关。而与类型的实例无关,编译器也不会由于这两个函数而在实例内加入不论什么额外的信息。

假设把上述的析构函数标记为虚函数,情况会如何?

C++编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每个实例中加入一个指向虚函数表的指针,在32位的机器上,一个指针占4字节的空间。因此求sizeof得到4,假设是64位的机器,一个指针占8字节的空间。因此求sizeof得到8.

(2)看C++程序,推断结果:

#include <iostream>

class A{

private:
int value; public:
A(int n){ value = n;
} A(A other){ value = other.value;
} void Print(){ std::cout<<value<<std::endl;
}
}; int main(int argc, const char * argv[]) { A a = 10;
A b = a;
b.Print(); return 0;
}

选择A.编译错误       B.编译成功,执行时程序崩溃             C.编译执行正常。输出10

答案是A。编译出错。

我把程序放到IDE中,报错行数和提演示样例如以下:

错误提示是说复制构造函数传递的第一个參数必须是引用类型。

在上述代码中,复制构造函数A(A other)传入的參数是A的一个实例。因为是传值參数,我们把形參拷贝到实參会调用复制构造函数。因此假设同意复制构造函数传值,就会在复制构造函数内调用复制构造函数,就会形成永无休止恶递归调用从而导致栈溢出。因此C++标准不同意复制构造函数传值參数。

在Visual Studio和GCC中,都会编译出错。要解决问题,就是把传值參数改动为常量引用。

代码例如以下:

A(A const &other){

        value = other.value;
}

(3)题目:例如以下为类型CMyString的声明,请为该类型加入赋值运算符函数。

class CMyString{

public:
CMyString(char* pData = NUll);
CMyString(const CMyString& str);
~CMyString(void); private:
char* m_pData; };

解决该问题应该首先注意下面几点:

1.是否把返回值的类型声明为该类型的引用。并在函数结束前返回实例自身的引用(即*this)。

仅仅有返回一个引用,才干够同意连续赋值。否则如果函数的返回值是void,应用该赋值对象符将不能做连续赋值。如果有三个CMyString对象,str1,str2,str3,在程序中语句str1=str2=str3将不能通过编译。

2.是否把传入的參数的类型声明为常量引用。假设传入的參数不是引用而是实例,那么从形參到实參会调用一次复制构造函数。把參数声明为引用能够避免这种无谓的消耗,能提高代码的效率。同一时候,我们在赋值运算符函数内不会改变传入的实例的状态。因此应该为传入的引用參数加上constkeyword。

3.是否释放实例自身已有的内存。假设我们忘记在分配新内存之前释放自身已有的空间,程序将出现内存泄露。

4.是否推断传入的參数和当前的实例(*this)是不是同一个实例。假设是同一个,则不进行赋值操作,直接返回。假设事先不推断就进行赋值,那么在释放实例自身的内存的时候就会导致严重的问题:当*this和传入的參数是同一个实例时,那么一旦释放了自身的内存。传入的參数的内存也同一时候被释放了,因此再也找不到须要赋值的内容了。

实现代码例如以下:

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];
strcpy(m_pData,str.m_pData); return *this;
}

(4)C++中能够使用struct和class来定义类型,这两种类型有什么差别?

假设没有标明成员函数或者成员变量的訪问权限级别,在struct中默认是public,在class中默认是private。

github主页:https://github.com/chenyufeng1991  。

欢迎大家訪问。

剑指Offer读书笔记(持续更新中)的更多相关文章

  1. 《剑指Offer》笔记(更新中)

    这几天为了找工作开始看<剑指offer>,到现在也大概浏览一遍了,前两天看作者博客中提到九度OJ,就去看了一下,发现上面有书上的题目,就想可以自己写代码练习一下,而不仅仅是看解题思路,毕竟 ...

  2. 剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)

    剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)2014-02-05 23:03 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直 ...

  3. 剑指Offer - 九度1348 - 数组中的逆序对

    剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...

  4. 剑指Offer - 九度1517 - 链表中倒数第k个结点

    剑指Offer - 九度1517 - 链表中倒数第k个结点2013-11-30 02:57 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含 ...

  5. 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字

    剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...

  6. 剑指Offer - 九度1351 - 数组中只出现一次的数字

    剑指Offer - 九度1351 - 数组中只出现一次的数字2013-11-23 01:23 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. ...

  7. 剑指offer:二维数组中的查找

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...

  8. 剑指 Offer 04. 二维数组中的查找 (思维)

    剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下 ...

  9. 【剑指Offer】孩子们的游戏(圆圈中最后剩下的数) 解题报告(Python)

    [剑指Offer]孩子们的游戏(圆圈中最后剩下的数) 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-in ...

随机推荐

  1. BZOJ1053 反素数

    题目大意 对于任何正整数x,其约数的个数记作g(x).如果某个正整数x满足对任意的0<i<x,都有g(x)>g(i) ,则称x为反质数.现在给定一个数N,求出不超过N的最大的反质数. ...

  2. bzoj5194: [Usaco2018 Feb]Snow Boots

    还真是.. 就是 一个被不点名批评的垃圾骗分暴力选手被普及难度的省选信心(??)模拟赛艹爆的题解 的t3嘛... #include<cstdio> #include<iostream ...

  3. Linux - Nginx配置反向代理。

    Nginx配置反向代理. 准备两台服务器 http://192.168.70.66 http://192.168.70.62 设置正则匹配(192.168.70.66) vim /usr/local/ ...

  4. net快速写入/读取大量数据Postgresql

    Postgresql快速写入/读取大量数据 http://www.cnblogs.com/podolski/p/7152144.html 环境及测试 使用.net驱动npgsql连接post数据库.配 ...

  5. 学习笔记:javascript中的Generator函数

    最近在学习redux-saga,由于redux-saga需要使用Generator函数,所以下来就回顾了一下Generator Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为 ...

  6. 超级简单的利用javascript实现文件拖拽事件

    1.效果图: 2.源码 <%@ page contentType="text/html;charset=UTF-8" language="java" %& ...

  7. Android学习——碎片Fragment的使用

    一.碎片的简单用法(实现在一个活动中添加两个碎片,并让这两个碎片平分活动空间) 1.新建一个FragmentTest项目: 新建一个左侧碎片布局left_fragment.xml,代码如下:(只放置一 ...

  8. C++中内存分配、函数调用和返回值问题

    转载博客:http://blog.csdn.net/q_l_s/article/details/52176159(源地址找不到,就贴了这位大神的博客地址,他也是转载的,不过要是学习的话,他的博客很不错 ...

  9. SSM 拦截器验证权限和登录与注销的实现

    拦截器的作用在于,比如我们输入 xxx.com/admin 发起请求进入 网站后台或者其他后台页面.我们的拦截器会在 Controller  调用之前进行拦截,至于什么拦截,由我们来写.比如,判断用户 ...

  10. 关于如何成为高级java程序员

    今日,对如何进一步提升java.成为一个高级的程序员有了兴趣,在网上看到一篇回答,感觉不错,记下来 总结了以下六点:一.JAVA基础 要想成为高级Java程序员,Java是一定要学习的.要成为高级程序 ...