c++学习—类(1) — 成员函数的形式和构造函数
头发要保不住了
怀着对知识的无限渴望,我一口气看了类的众多文字,然后,发现学到的就这么些,哎,菜鸡的我学的太慢了。
类是什么?
类:类是一种用户自定义的复杂数据类型,他是将不同类型的数据和与这些数据相关的操作封装在一起的结合体(有点像c的struct,天真的想法)
类是结构体衍生过来了,为了处理数据隐蔽性问题,暂时我是这么理解的,但是。我觉得类最高级的地方,目前就是装x。
c有struct,但是c++有class。其实差不多,区别就在他们默认数据成员不一样。先说数据成员吧。
数据成员
有三种,一种是public,一种是protected,还有一种是private。
作用:
public 是公共成员,也就是他里面所属的成员是可以被外界随意使用的。
protected是保护成员,具体作用,目前不太懂,讲不清楚,万分抱歉。
private是私有成员,意味着里面所储存的数据类型只有这个结构体(类)可以使用。
一言不可上代码:
#include<bits/stdc++.h>
using namespace std;
class node{
public:
int x1,y1;
private:
int x2,y2;
}a;
int main()
{
a.x1 = 1;
a.y1 = 2;
cout<<a.x1<<a.y1;
//下面调用会出错
a.x2 = 1;
a.y2 = 2;
return 0;
}
出错原因就是x2,y2他是在private里面,外面不能使用它们。
理解了这些,再说struct和class的区别,struct默认里面的成员都是公有的,也就是public,但是class默认是私有的,所以如果要把struct换成class要注意吧类型转换一下,加一个public。(毕竟我们写struct不怎么写public)。
那么问题来了,既然private里面成员不可用,那么有什么意义呢?怎么使用呢?
成员函数
在结构体里写函数,确实可以,但是写的少,因为感觉没必要,但是这是访问私有成员的方法,私有成员可以被写在该类(结构体)的函数调用
请看代码:
#include<bits/stdc++.h>
using namespace std;
class node{
public:
void get_x(int a,int b)
{
x2 = a;
y2 = b;
}
void print()
{
cout<<x2<<y2;
}
private:
int x2,y2;
}a;
//也可以这么写 ,但是要在结构体里先声明。声明应该没问题。
//void node :: print()
//{
// cout<<x2<<y2;
//}
int main()
{
a.get_x(1,2);
a.print();
return 0;
}
简而言之,就是通过处于该类公共区间的函数去调用私有空间的数据。
构造函数
作用:构造函数可以用来对类里面的数据进行初始化。
特点:1.构造函数是每次创造一个类时就会自动调用的,自动运行。
2.构造函数没有返回值,因为是特定的一种方式
3.构造函数的命名一定要和类名一样
具体看代码
#include<bits/stdc++.h>
using namespace std;
class node{
public:
node(int a,int b); //声明一个构造函数 此处注意名字要和类名一样,且不需要返回值
void print()
{
cout<<x2<<y2;
}
private:
int x2,y2;
};
node :: node(int a,int b) //构造函数书写
{
x2 = a;
y2 = b;
}
int main()
{
node a(1,2); //创造一个类,并初始化。
a.print();
return 0;
}
可以看出,构造函数不需要我们调用,是自动执行的。
但是,有的时候,会看到一些大神这么写构造函数。
class node{
public:
node(int a,int b):x2(a),y2(b){};
void print()
{
cout<<x2<<y2;
}
private:
int x2,y2;
};
这是成员初始化列表,详情可以自行查询。简而言之,也是一种初始化的方法,为了方便,但是有一些使用细节要注意,比如赋值顺序和命名顺序有关,和变量名先后无关,可以理解成在“:”后面的赋值,是看private里面类型的声明顺序。下面写法就无法完成初始化:
#include<bits/stdc++.h>
using namespace std;
class node{
public:
node(int a):y2(a),x2(y2){};
void print()
{
cout<<x2<<y2;
}
private:
int x2,y2;
};
int main()
{
node a(1);
a.print();
return 0;
}
最后会发现x2 = 鬼知道什么数,y2 = 1;也就是程序先将x2初始化,在初始化y2。
拷贝构造函数
拷贝构造函数,顾名思义。就是用于拷贝的构造函数。
格式如下:
类名::类名(const 类名 &对象)
{
拷贝构造函数函数头。
}
用于拷贝的函数,可以自己写拷贝规则,这个规则你甚至可以写成交换x与y的值。还是比较方便的。下面是一个拷贝构造函数的例子
#include<bits/stdc++.h>
using namespace std;
class node{
public:
node(int a,int b);
node(const node & p)
{
x2 = p.x2;
y2 = p.y2;
}
void print()
{
cout<<x2<<y2;
}
private:
int x2,y2;
};
node :: node(int a,int b)
{
x2 = a;
y2 = b;
}
int main()
{
node a(1,2);
node b(a);
a.print();
cout<<endl;
b.print();
return 0;
}
本章就干到这里,在有常用的再补充,欢迎评论补充。其实这里介绍的比较浅显,很多要注意的地方没有说,还有比如构造函数重载、浅拷贝和深拷贝、析构函数等等都没有介绍到。this指针下一节在介绍。想具体学习还请浏览相关书籍。