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

类和对象提高

this指针

作用就是指向成员函数所做用的对象,注意它是一个指针。

class Complex{
public:
double real, imag;
Complex AddOne(){
this->real++;
return * this;
}
};

静态成员函数之中没有this指针,因为静态成员函数不具体作用于某个对象。

对象的成员函数在被解释时会多增加一个参数,即指向自己这个对象的this指针。因此存在下面这样一个特殊的用法:

class A{
public:
int i = 0; void hello1(){
cout << "hello" << endl;
} void hello2(){
cout << i << "hello" << endl;
}
}; int main(){
A * p = NULL;
p->hello1(); //正确,输出hello
p->hello2(); //错误
}

原因:

void hello1(){ cout << "hello" << endl; }被解释为void hello1(A * this){ cout << "hello" << endl; }

void hello2(){ cout << i << "hello" << endl;}被解释为void hello2(A * this){ cout << this->i << "hello" << endl;}

p->hello1();被解释为hello1(p)

p->hello2();被解释为hello2(p)

静态成员变量与函数

静态成员变量的用法与java相同。

需要注意的是必须在定义类的文件中,在所有的类和函数之外,对静态变量进行说明(可选择初始化,也可不选),具体方法如下:

class A{
public:
static int total;
}; int A::total = 0; void main(){ }

静态成员函数的访问方法:

  1. 类名::成员名 Circle::Print();
  2. 对象名.成员名 Circle c; c.Print();
  3. 指针->成员名 Circle * p = &c; p->Print();
  4. 引用.成员名 Circle & r = c; r.Print();

同java一样,在静态成员函数中不可以访问非静态成员变量,也不可以调用非静态成员函数。

注意复制构造函数和析构函数的隐式调用可能会对静态成员变量的值产生影响。

成员对象和封闭类

成员对象:某一个类中的成员变量是另一个类的对象。

封闭类:具有成员变量的类。

任何生成封闭类对象的语句,都要使编译器明白,对象中的成员对象,是如何初始化的。

如何做到:通过封闭类的构造函数的初始化列表为成员对象初始化。

封闭类构造函数和析构函数的执行顺序:

  1. 封闭类对象生成时,先执行成员对象的构造函数,再执行封闭类的构造函数。
  2. 成员对象的构造函数的执行顺序与其在类中的说明次序一致,与在构造函数初始化列表中的顺序无关。
  3. 封闭类对象消亡时,先执行封闭类的析构函数,再执行成员对象的析构函数。先构造的后析构

常量对象、常量成员函数

常量对象与常量成员函数:不可以修改成员变量的值(除静态成员变量),也不可以调用同类的非常量成员函数(除静态成员函数)。定义方法如下:

class Circle{
public:
int value;
void GetValue() const; //定义常量成员函数
void func();
}; void Circle::GetValue() const{
value = 0; //wrong
func(); //wrong
} int main(){
const Circle c; //定义常量对象
c.value = 0; //wrong
c.func(); //wrong
c.GetValue(); //ok return 0;
}

常量函数与其同名的函数是重载的关系。

友元

友元函数:一个类的友元函数不是这个类的成员函数,但是可以访问该类的私有成员。

友元类:如果A是B的友元类,那么A的所有成员函数都可以访问B的私有成员。

友元关系不可继承,不可传递。

使用方法如下:

class Car;
class Driver{
public:
void ModifyCar(Car * pcar);
}; class Car{
private:
int price;
friend int MostExpensiveCar(Car cars[], int total); //在这里声明
friend void Driver::ModifyCar(Car * pcar);
friend Type; //在这里声明
}; class Type{ }; void Driver::ModifyCar(Car * pcar){ } int MostExpensiveCar(Car cars[], int total){ } int main(){
return 0;
}

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

  1. servlet学习笔记_3

    一.路径问题如果是在浏览器端请求服务器的数据(超链接,js的src),那么加/代表在Tomcat的webapp目录,不加/的话通常不考虑,实际上不加/在浏览器端也是当前项目目录(但是开发中通常必须要写 ...

  2. Java编程思想学习笔记_3(继承,内部类)

    一.继承与清理 如果某个类需要去清理自身的资源,那么必须用心为其创建回收垃圾的方法,而如果此类有导出的子类,那么必须在导出类中覆盖回收的方法,当覆盖被继承类的回收垃圾的方法的时候,需要注意销毁的顺序应 ...

  3. PythonI/O进阶学习笔记_3.2面向对象编程_python的继承(多继承/super/MRO/抽象基类/mixin模式)

    前言: 本篇相关内容分为3篇多态.继承.封装,这篇为第二篇 继承. 本篇内容围绕 python基础教程这段: 在面向对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法.使 ...

  4. PythonI/O进阶学习笔记_3.1面向对象编程_python的多态和鸭子类型

    前言: 与第一篇的面向对象内容不同的是,第一篇中的面向对象更多的是与类.对象结合起来的概念粗浅理解,就是在编程历史中诞生的一种思想方法. 这篇的面向对象编程,更多落实到在语言设计实现中,是如何体现面向 ...

  5. PythonI/O进阶学习笔记_3.2面向对象编程_python的封装

    前言: 本篇相关内容分为3篇多态.继承.封装,这篇为第三篇 封装. 本篇内容围绕 python基础教程这段: 在面向对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法.使 ...

  6. python 学习笔记_3 输入字母,打印出要输入的星期几; 首字母无效,则继续输入,最多2次即可判断结果;否则退出。

    #coding=gbk ''' 输入字母,打印出要输入的星期几: 首字母无效,则继续输入,最多2次即可判断结果:否则退出. ''' week_list=['monday','tuesday','wed ...

  7. A.Kaw矩阵代数初步学习笔记 4. Unary Matrix Operations

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

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

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

  9. Flink学习笔记:Flink API 通用基本概念

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

随机推荐

  1. 使用jaxb用xsd生成java类

    命令: xjc -p 包的路径 xsd的名字.xsd -d 目标的文件夹 具体详细见: http://www.iteye.com/topic/1118082

  2. SIGAI机器学习第九集 数据降维2

    讲授LDA基本思想,寻找最佳投影矩阵,PCA与LDA的比较,LDA的实际应用 大纲: 非线性降维算法流形的概念流形学习的概念局部线性嵌入拉普拉斯特征映射局部保持投影等距映射实验环节 非线性降维算法: ...

  3. P4178 Tree 点分治

    思路:点分治 提交:1次 题解: 要求权值和\(\leq K\) 的路径,我们可以类比点分治的模板,把长为\(len\)是否存在,改为\(len\)的路径的条数,并用用树状数组维护前缀和,这样就可以求 ...

  4. PHP mmysqli_affected_rows(connection);函数

    mysqli_affected_rows(); 函数返回前一次 MySQL 操作所影响的记录行数. mysqli_affected_rows(connection); connection 必需.规定 ...

  5. [ZJOI2009]假期的宿舍 二分图匹配匈牙利

    [ZJOI2009]假期的宿舍 二分图匹配匈牙利 一个人对应一张床,每个人对床可能不止一种选择,可以猜出是二分图匹配. 床只能由本校的学生提供,而需要床的有住校并且本校和外校两种人.最后统计二分图匹配 ...

  6. 【概率论】3-6:条件分布(Conditional Distributions Part I)

    title: [概率论]3-6:条件分布(Conditional Distributions Part I) categories: Mathematic Probability keywords: ...

  7. php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法

    使用压缩包函数必须要安装zip扩展,否则会报错 $ apt install php-zip

  8. Win10配置Java环境变量

    很多同学在学习Java入门的时候被Java环境变量搞的一头雾水,今天这篇文章拓薪教育就来说一下如何在win10下配置环境变量; 下载jdk安装包: 首先我们需要下载jdk的安装包,这里提供jdk的安装 ...

  9. Tomcat部署时war和war exploded区别以及如何实现热部署

    war和war exploded的区别       使用IDEA配置Tomcat服务的时候,在 Select Artifacts to Deploy 选项中相同项目名有war和 war explode ...

  10. 八十年代的经典 NFS和AFS

    NFS:(C/S模式) 大体架构: 1985年Sun公司基于UDP开发了网络共享文件系统(Network FileSystem) NFS由一系列NFS命令和进程组成的客户机/服务器模式,在第三版中加入 ...