前言:本笔记所对应的课程为中国大学mooc中北京大学的程序设计与算法(三)C++面向对象程序设计,主要供自己复习使用,且本笔记建立在会使用c和java的基础上,只针对与c和java的不同来写

第二章 类和对象基础

类和对象的基本概念补充

  1. 某成员缺省关键字时,默认为private
  2. 访问范围:在类的成员函数内部,能访问当前对象和其他同类对象的全部属性和函数;在类的成员函数以外的地方,只能访问该对象的public成员。
  3. 同时使用缺省参数和重载时要注意避免二义性。

构造函数

如何创建一个对象:

class Complex {
private:
int v;
public:
Complex() { v = 0;} //(1)
Complex(int n) { v = n;} //(2)
Complex(int n, int m) { v = n - m;} //(3)
}; Complex c1;
Complex * pc1 = new Complex;
Complex c2(2), c3(3);
Complex * pc2 = new Complex(2); Complex array1[3]; //产生3个(1)初始化的对象
Complex array2[3] = {3, 0}; //产生两个(2)初始化的对象,产生一个(1)初始化的对象
Complex * array3 = new Complex[3]; //产生三个(1)初始化的对象
Complex array4[3] = {4, Complex(1, 2)}; //产生三个对象,分别用(2)(3)(1)初始化
Complex * array5 = {new Complex(4), NULL, new Complex(5, 6)}; //产生两个对象,分别用(2)(3)初始化

注意:构造函数在缺省时,会自动生成一个不带参数的构造函数;但当存在带参数的构造函数时,则不会生成不带参数的构造函数。

复制构造函数

用于将一个对象复制。形如X::X(X &)或者X::X(const X &)。如果没有明确定义,则会生成默认的一个复制构造函数用于复制对象;而当自己定义了复制构造函数时,默认的复制构造函数将不存在。

参数必须是引用

复制构造函数起作用的三种情况:

  1. 用一个对象去初始化同类的另一个对象时。(即直接调用复制构造函数)有两种不同的写法,见下面的代码。
  2. 当一个函数的参数是某个类的对象时,那么调用这个函数,该类的复制构造函数会被调用。
  3. 当一个函数的返回值是某个类的对象时,那么调用这个函数,该类的复制构造函数会被调用。

对于第二种情况,由于复制对象会造成较大的系统开销,因此当想要避免这种情况的时候,可以将参数改为引用的形式;如果还不希望该对象被修改,那么还可以加上const关键字。

类型转换构造函数

用于实现类型的自动转换。只有一个参数且不是复制构造函数的构造函数都称为类型转换构造函数。

class Complex {
private:
int v;
public:
Complex() { v = 0;}
Complex(int n) {
//只有此函数是类型转换构造函数,而其他两个构造函数则不是
v = n;
cout << "调用了类型转换构造函数" << endl;
}
Complex(int n, int m) { v = n - m;}
Complex(const Complex & c){
v = c.v;
cout << "调用了复制构造函数" << endl;
}
int getV() {return v;}
}; Complex c1(9);
Complex c2 = c1;
Complex c3(c1);
//以上两句话是直接调用复制构造函数的两种等价用法。注意第二句中的等号是初始化的意思,而不是赋值的意思。
c3 = c2;
//这句话中的等号是赋值的意思(由于c2c3都是已经存在的对象),所以既不调用复制构造函数,也不调用类型转换构造函数。 Complex c4(9, 3);
Complex c5 = 12;
//上面这句话是类型转换构造函数的用法。
//其原理是,检查到等号两侧类型不同,所以将12先调用类型转换构造函数转换成一个临时的Complex对象,然后再将其赋值给c5。
//注意和上面不同的是,这里赋值给c5时并没有调用复制构造函数,这里的等号的意义是赋值,而不是初始化。
c4 = 11;
//除了像上面那样用类型转换构造函数初始化一个对象外,还可以改变一个现有的对象。同样这里也并没有调用复制构造函数,等号的意义是赋值。

总结:

类型转换构造函数有两个功能,当显式调用时,用于初始化一个对象;当隐式调用时,用于强制类型转换。如果想禁用隐式调用的功能,则可以在函数前加关键字explicit。此时,上面的两种用法Complex c5 = 12Complex c4 = 11都无法通过编译,只能写成Complex c5 = Complex(12)的形式。

析构函数

  1. 析构函数在对象消亡时被自动调用,可用来做释放空间等工作。
  2. 一个类只能有一个析构函数。写法:在无参数的构造函数前加一个~就是析构函数。
  3. 没有显式定义析构函数的时候,生成缺省析构函数,缺省析构函数什么都不做。
  4. 对象作为函数参数或函数返回值时析构函数都很可能会被调用。
  5. main函数结束的时候会自动回收对象,因此会调用析构函数。
  6. new出的对象如果没有用delete删除,在main函数结束的时候不会被自动回收,因此不会调用析构函数。

c++学习笔记_2的更多相关文章

  1. servlet学习笔记_2

    一.Servlet线程安全问题1.servlet的线程安全问题.servlet引擎采用多线程的模式运行,它为并发的每个访问请求都预备一个线程来相应,但是由于只有一个servlet对象,因此,如果多个线 ...

  2. Java编程思想学习笔记_2(继承和多态)

    静态初始化: 静态初始化只在必要的时刻进行.(即当程序需要加载类进入内存的时候,执行静态初始化.静态变量和静态代码块的初始化顺序,按照在代码中声明的顺序老执行.例如:如果要执行某个public类,那么 ...

  3. PythonI/O进阶学习笔记_2.魔法函数

    前言: 本文一切观点和测试代码是在python3的基础上. Content: 1.什么是魔法函数,魔法函数__getitem__在python中应用. 2.python的数据模型和数据模型这种设计对p ...

  4. python 学习笔记_2 模拟socket编程 服务端、客户端通信(参考核心编程2代码实现)

    服务器端代码实现: #!/usr/bin/env python#coding=gbk'''接收客户端字符串,在字段串前面打上当前时间,然后返回server端采用 python2 linux下调试运行客 ...

  5. matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色

    一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 < ...

  6. Vue学习笔记-2

    前言 本文非vue教程,仅为学习vue过程中的个人理解与笔记,有说的不正确的地方欢迎指正讨论 1.computed计算属性函数中不能使用vm变量 在计算属性的函数中,不能使用Vue构造函数返回的vm变 ...

  7. A.Kaw矩阵代数初步学习笔记 2. Vectors

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  8. Scala学习笔记之:tuple、array、Map

    [TOC] 本文<快学Scala>的笔记 tuple学习笔记 tuple的定义 对偶是元组(tuple)的最简单形态--元组是不同类型的值的聚集. 元组的值是通过将单个值包含在圆括号中构成 ...

  9. Spark学习笔记-GraphX-1

    Spark学习笔记-GraphX-1 标签: SparkGraphGraphX图计算 2014-09-29 13:04 2339人阅读 评论(0) 收藏 举报  分类: Spark(8)  版权声明: ...

随机推荐

  1. CSS实现宽度自适应100%,宽高16:9的比例的圖片或者矩形

    前言 图片的大小是多少,宽度一定,高度要始终自自适应为16:9. 解决 1通过js,程序算出绝对高度再进行设置.这是解决问题最容易想到的方法. 2.我们的原则是能用css实现的功能尽量用css,这有利 ...

  2. stm32焊接心得

    早上焊接了一块朋友给的stm32f103zet6的开发板,起初,烙铁怎么都焊补上去,原来是烙铁头已经氧化,只能作罢! 那里一个新的焊接,温度打到450,基本上,焊接就非常顺利,当然温度不要太高,以免弄 ...

  3. Tensorflow2.0学习(一)

    站长资讯平台:今天学习一下Tensorflow2.0 的基础 核心库,@tf.function ,可以方便的将动态图的语言,变成静态图,在某种程度上进行计算加速 TensorFlow Lite Ten ...

  4. C# MVC中直接执行Js

    .NET MVC里如何在服务器端执行JS: 三种解决方案: 1.直接返回JavaScript. public ActionResult XXXAction1() {      return JavaS ...

  5. E:last-child

    E:last-child 语法: E:last-child { sRules } 说明: 匹配父元素的最后一个子元素E.大理石平台厂家大理石平台厂家 要使该属性生效,E元素必须是某个元素的子元素,E的 ...

  6. Oracle 后台进程(五)SMON进程

    转载自:刘相兵 Maclean Liu 文章 你所不知道的后台进程 SMON 功能   SMON(system monitor process)系统监控后台进程,有时候也被叫做 system clea ...

  7. [Luogu] LCA

    https://www.luogu.org/problemnew/show/P4211 baoli #include <iostream> #include <cstdio> ...

  8. 《剑指offer》数组中只出现一次的数字

    本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ...

  9. RNN(二)——基于tensorflow的LSTM的实现

    lstm的前向结构,不迭代 最基本的lstm结构.不涉及损失值和bp过程 import tensorflow as tf import numpy as np inputs = tf.placehol ...

  10. 更改用户id 和组id

    转自 http://blog.csdn.net/todd911/article/details/16370577 在unix系统中,特权是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许 ...