Lemon's blog

C++学习总结(函数、类与对象)

Record my learning process of C++.

字数统计: 1.3k阅读时长: 5 min
2019/06/19 Share

前言:时间过的好快,转眼一学期就过去了,期末考试也快到了,所以就复习一遍同时也将自己学习的感悟总结下来。前面几章大多与C语言相似,就不总结了。

第三章——函数

参数传递
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>

using namespace std;

void swap(int a,int b) {
int t=a;
b=t;
a=b;
}

int main()
{
int x=5,y=10;
cout<<"x= "<<x<<" y= "<<y<<endl;
swap(x,y);
cout<<"x= "<<x<<" y= "<<y<<endl;
return 0;
}
//输出结果
x= 5 y= 10
x= 5 y= 10

通过这个例子,可以看出形参值的改变对实参是无影响的,如果是引用传递的话就另当别论了,看下面这个例子。
在这里插入图片描述
可以看出,如果使用引用参数的话是可以改变实参的值,但要注意:

  • 声明一个引用时,必须同时对它进行初始化,使它指向一个已经存在的对象
  • 一旦一个引用被初始化后,就不能改为指向其他对象
内敛函数

在这里插入图片描述
对于内敛函数,我的理解是就相当于一个类中公有类型的成员函数,只不过是放在了类外面,需要在函数返回值类型前加上inline,而且内敛函数大多都是调用频率很高,而且代码是相对简单的。

带默认形参值的函数

在这里插入图片描述
通过这个代码就会理解带默认形参值的函数,但也有几点要注意:

  • 有默认值的形参必须在形参列表的最后,因为实参与形参是按照从左到右的顺序建立关系的。
  • 在相同的作用域中,不允许在同一个函数的多个声明中对一个参数的默认值重复定义。
函数重载

在这里插入图片描述
说白了,就是同一个函数名,但又不同的功能,这就叫函数重载,也需注意:

  • 函数重载不以形参名来区分函数
  • 函数重载不以返回值来区分函数

第四章——类与对象

类的定义:
class 类名称
{
public:
外部接口
private:
私有成员
};
对象声明:
类名 对象名;
对象访问数据成员:
对象名.数据成员名
对象调用函数成员:
对象名.函数成员名(参数表)
成员函数的实现:
返回值类型 类名::函数成员名(参数表)
{
函数体
}

例如:

1
2
3
4
5
6
7
8
9
void Clock::setTime(int newH,int newM,int newS) {
hour=newH;
minute=newM;
second=newS;
}

void Clock::showTime() {
cout<<huor<<":"<<minute<<":"<<seconde<<endl;
}

到这才算刚接触到C++,这些便是C++访问成员函数或对象的一些方法。

构造函数

在这里插入图片描述
通过这个代码,感觉构造函数有一般成员函数的特征,但构造函数有一些特殊的特征:构造函数的函数名与类名相同,而且没有返回值

复制构造函数

复制构造函数的一般方法
class 类名
{
public:
类名(形参名);//构造函数
类名(类名 &对象名);//复制构造函数

};
类名::类名(类名 &对象名);//复制构造函数的实现
{
函数体
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>

using namespace std;

class point {
public:
point(int xx=0,int yy=0) {
x=xx;
y=yy;
}
point(point &p);
int getX() {return x;}
int getY() {return y;}
private:
int x,y;
};
//成员函数实现
point::point(point &p) {
x=p.x;
y=p.y;
cout<<"copy"<<endl;
}
//形参为point类对象的函数
void fun1(point p) {
cout<<p.getX()<<endl;
}

//返回值为point类对象的函数
point fun2(){
point a(1,2);
return a;
}

int main()
{
point a(4,5);
point b=a;//情况一,用a初始化b.第一次调用复制构造函数
cout<<b.getX()<<endl;
fun1(b);//情况二,对象b作为fun1的实参。第二次调用复制构造函数
b=fun2();//情况三,函数返回值是类对象,函数返回时,调用复制构造函数
cout<<b.getX()<<endl;
return 0;
}

在这里插入图片描述
通过这个代码来了解一下复制构造函数,复制构造函数拥有一般构造函数的所有特性,而它所不同的是形参是本类的对象的引用作用是使用一个已经存在的对象(由复制构造函数的参数指定),去初始化同类的一个新对象。这个概念理解起来最好是通过代码,这样便于理解。

复制函数有三种情况可以被调用:

  • 当用类的一个对象去初始化该类的另一个对象时。
  • 如果函数的形参是类的对象,调用函数时,进行形参和实参的结合时。
  • 如果函数的返回值是类的对象,函数执行完成返回调用者时。
析构函数

构造对象时,构造函数中分配了资源,动态申请了一些内存单元,在对象消失时需要释放这些内存单元。而析构函数就用来完成对象被删除前的一些清理工作析构函数是在对象的生产期即将结束的时刻被自动调用的。而且析构函数不接收任何参数
在这里插入图片描述

CATALOG
  1. 1. 第三章——函数
    1. 1.0.1. 参数传递
    2. 1.0.2. 内敛函数
    3. 1.0.3. 带默认形参值的函数
    4. 1.0.4. 函数重载
  • 2. 第四章——类与对象
    1. 2.0.1. 构造函数
    2. 2.0.2. 复制构造函数
    3. 2.0.3. 析构函数