static关键字修饰的函数,会改变连接属性,只在当前文件可见(不会生成符号表)
两个文件包含了两个相同的函数,想要在编译的时候不报链接错误的方法(报告链接错误的原因是函数重定义了)
- 函数前面加上static关键字,改变链接属性
- 内联函数
- 声明和定义分离
auto关键字有以下不能用的地方
- 不能当函数参数
- 不能当返回值(现在的标准可以)
- 不能当数组的类型
面向对象的三大特性
- 封装
- 继承
- 多态
CPP面向对象,封装体现在以下几点
- CPP数据和方法都放在类里面
- CPP访问限定符会对成员进行限制,想给你访问是公有,不想给你访问是私有或保护
- 封装的本质是一种管控
构造函数是特殊的成员函数,其特征如下:
- 函数名和类名相同
- 无返回值
- 对象实例化(创建对象)时编译器自动调用对应的构造函数
- 构造函数可以重载(一个对象可以有多种初始化的方式)
- 如果构造函数需要参数,那么可以这么写
构造函数的主要任务并不是开空间创造对象,而是初始化对象
对象的实例化,Stack st.Stack(4)这样写不行的原因是:
在st实例化的时候st都没创建,更别说调用构造函数了,编译器无法区分这是声明函数名或者创建对象
析构函数的功能
与构造函数功能相反,在对象销毁时(对象出了作用域)自动调用析构函数,完成对象中资源的清理工作
析构函数的特征
- 析构函数名是在类名前加上字符~
- 无参数无返回值
- 一个类只能有一个析构函数,并且不能重载
- 在生命周期结束时,对象自动调用析构函数
函数重载的条件
- 函数名相同
- 参数不同
C++编译器自己的默认构造函数(这一点对析构函数也是一样的)不是很好,有以下及几个方面
- 内置类型成员不做处理(内置类型包括,int,double,指针,除了class和struct)(有的编译器会做处理,但是其实本来就是不会处理的,这个要记住)
- 自定义类型的成员,会去调用它的构造(不用传参的构造)
- 自定义类型是class和struct
拷贝构造函数的定义
拷贝构造函数的函数名和类名相同,但是参数要用引用
为什么自定义类型不能传值传参?
内置类型,编译器可以直接拷贝
自定义类型的拷贝,需要调用拷贝构造函数(传值调用,传值传参,就要使用拷贝构造,但是引用不会,所以要用引用,而且前面一般会加const,如果传的是对象的地址(参数是对象的指针),那就不是拷贝构造,而是构造函数)
原因是因为两个对象有可能会指向同一块空间,但是生命周期到了之后,对象会调用析构函数
针对这种情况,C++在对象拷贝的时候,会用拷贝构造
默认构造函数的范围
- 全缺省的构造函数
- 没有参数的构造函数
- 自己没写构造函数,编译器自己提供的构造函数
拷贝构造函数的特征
- 拷贝构造函数是构造函数的一个重载形式
- 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器会直接报错,因为会引发无穷递归调用
友元声明
变成对象的朋友,能够访问对象里面的私有成员,写好函数声明之后,友元的函数还要声明要写在类里,前面加上friend即可(函数定义可以不用写friend)
被const修饰的对象,不能够调用成员函数,是因为const Date* this变成了Date* this,权限会放大,解决方法如下:
在成员函数后面加上const,这样就是const Date* this(后面加上const只是成员函数会这么写,用来修饰this)
初始化列表的格式
以":"开始,","进行分割,最后加上{}
初始化列表的作用
有些成员必须走初始化列表
- const成员变量
- 引用成员变量
- 没有默认构造的自定义成员
初始化列表中的变量不能出现很多次
初始化列表中的成员只能出现一次(只能初始化一次)
单参数构造函数支持隐式类型的转换
用explicit可以不让转换
多参数构造函数,可以加上大括号{}这么写,支持隐式类型的转换
初始化列表初始化的顺序是按照声明的顺序初始化的
先初始化a2,然后是a1(声明的顺序最好和初始化列表的顺序一致)
属于所有的对象的成员变量是怎么定义的
本质上是一种全局变量,这个成员变量,如果是公有可以随便访问,私有就要提供一个共有的Get函数
静态成员函数和普通成员函数的区别
没有this指针
被const修饰的对象(假设是Date类型),如果取地址,会变成const Date* 地址,就不能传给成员函数(因为this指针不是const),如果想要传递,可以用下面的方法:
成员函数后面加上const
初始化列表后面可以跟上函数
初始化列表初始化的顺序不是初始化列表的顺序,而是声明的顺序
所以a2是随机值,只初始化了a1
建议是:声明顺序和初始化列表顺序保持一致
静态的成员变量,不是属于某一个对象,属于所有对象,属于整个类,不能给缺省值
要想初始化这个成员,要在类里面声明,类外面定义
静态的成员函数和普通的成员函数相比
静态成员函数没有this指针,所以不能访问普通的成员变量
它的用途只有一个,就是访问静态成员变量