对象,友元,初始化列表

本文介绍了C++中static关键字的用法,以及函数重定义、封装、构造函数(包括构造、拷贝构造和析构)、析构函数、函数重载、友元和初始化列表等面向对象编程的关键概念。特别强调了静态成员函数与普通成员函数的区别和使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

拷贝构造函数的定义

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

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

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

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

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

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

默认构造函数的范围

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

拷贝构造函数的特征

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

友元声明

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

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

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

初始化列表的格式

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

初始化列表的作用

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

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

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

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

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

用explicit可以不让转换

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

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

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

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

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

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

没有this指针

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

成员函数后面加上const

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

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

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

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值