对象,友元,初始化列表

static关键字修饰的函数,会改变连接属性,只在当前文件可见(不会生成符号表

两个文件包含了两个相同的函数,想要在编译的时候不报链接错误的方法(报告链接错误的原因是函数重定义了)

  1. 函数前面加上static关键字,改变链接属性
  2. 内联函数
  3. 声明和定义分离

auto关键字有以下不能用的地方

  1. 不能当函数参数
  2. 不能当返回值(现在的标准可以)
  3. 不能当数组的类型

面向对象的三大特性

  1. 封装
  2. 继承
  3. 多态

CPP面向对象,封装体现在以下几点

  1. CPP数据和方法都放在类里面
  2. CPP访问限定符会对成员进行限制,想给你访问是公有,不想给你访问是私有或保护
  3. 封装的本质是一种管控

构造函数是特殊的成员函数,其特征如下:

  1. 函数名和类名相同
  2. 无返回值
  3. 对象实例化(创建对象)时编译器自动调用对应的构造函数
  4. 构造函数可以重载(一个对象可以有多种初始化的方式
  5. 如果构造函数需要参数,那么可以这么写

构造函数的主要任务并不是开空间创造对象,而是初始化对象

对象的实例化,Stack st.Stack(4)这样写不行的原因是:

在st实例化的时候st都没创建,更别说调用构造函数了,编译器无法区分这是声明函数名或者创建对象

析构函数的功能

与构造函数功能相反,在对象销毁时(对象出了作用域)自动调用析构函数,完成对象中资源的清理工作

析构函数的特征

  1. 析构函数名是在类名前加上字符~
  2. 无参数无返回值
  3. 一个类只能有一个析构函数,并且不能重载
  4. 在生命周期结束时,对象自动调用析构函数

函数重载的条件

  1. 函数名相同
  2. 参数不同

C++编译器自己的默认构造函数(这一点对析构函数也是一样的)不是很好,有以下及几个方面

  1. 内置类型成员不做处理(内置类型包括,int,double,指针,除了class和struct)(有的编译器会做处理,但是其实本来就是不会处理的,这个要记住
  2. 自定义类型的成员,会去调用它的构造(不用传参的构造)
  3. 自定义类型是class和struct

拷贝构造函数的定义

拷贝构造函数的函数名和类名相同,但是参数要用引用

对象,友元,初始化列表_第1张图片

为什么自定义类型不能传值传参?

内置类型,编译器可以直接拷贝

自定义类型的拷贝,需要调用拷贝构造函数(传值调用,传值传参,就要使用拷贝构造,但是引用不会,所以要用引用,而且前面一般会加const,如果传的是对象的地址(参数是对象的指针),那就不是拷贝构造,而是构造函数)

原因是因为两个对象有可能会指向同一块空间,但是生命周期到了之后,对象会调用析构函数

对象,友元,初始化列表_第2张图片

针对这种情况,C++在对象拷贝的时候,会用拷贝构造

默认构造函数的范围

  1. 全缺省的构造函数
  2. 没有参数的构造函数
  3. 自己没写构造函数,编译器自己提供的构造函数

拷贝构造函数的特征

  1. 拷贝构造函数是构造函数的一个重载形式
  2. 拷贝构造函数的参数只有一个必须是类类型对象的引用,使用传值方式编译器会直接报错,因为会引发无穷递归调用

友元声明

变成对象的朋友,能够访问对象里面的私有成员,写好函数声明之后,友元的函数还要声明要写在类里,前面加上friend即可(函数定义可以不用写friend)

被const修饰的对象,不能够调用成员函数,是因为const Date* this变成了Date* this,权限会放大,解决方法如下:

在成员函数后面加上const,这样就是const Date* this(后面加上const只是成员函数会这么写,用来修饰this)

初始化列表的格式

以":"开始,","进行分割,最后加上{}

对象,友元,初始化列表_第3张图片

初始化列表的作用

有些成员必须走初始化列表

  1. const成员变量
  2. 引用成员变量
  3. 没有默认构造的自定义成员

初始化列表中的变量不能出现很多次

初始化列表中的成员只能出现一次(只能初始化一次)

单参数构造函数支持隐式类型的转换

用explicit可以不让转换

多参数构造函数,可以加上大括号{}这么写,支持隐式类型的转换

对象,友元,初始化列表_第4张图片

初始化列表初始化的顺序是按照声明的顺序初始化的

先初始化a2,然后是a1(声明的顺序最好和初始化列表的顺序一致)

属于所有的对象的成员变量是怎么定义的

本质上是一种全局变量,这个成员变量,如果是公有可以随便访问,私有就要提供一个共有的Get函数

静态成员函数和普通成员函数的区别

没有this指针

被const修饰的对象(假设是Date类型),如果取地址,会变成const Date* 地址,就不能传给成员函数(因为this指针不是const),如果想要传递,可以用下面的方法:

对象,友元,初始化列表_第5张图片

成员函数后面加上const

初始化列表后面可以跟上函数

初始化列表初始化的顺序不是初始化列表的顺序,而是声明的顺序

对象,友元,初始化列表_第6张图片

所以a2是随机值,只初始化了a1

建议是:声明顺序和初始化列表顺序保持一致

静态的成员变量,不是属于某一个对象,属于所有对象,属于整个类,不能给缺省值

要想初始化这个成员,要在类里面声明,类外面定义

对象,友元,初始化列表_第7张图片

静态的成员函数和普通的成员函数相比

静态成员函数没有this指针,所以不能访问普通的成员变量

它的用途只有一个,就是访问静态成员变量

你可能感兴趣的:(C++,c++)