1对象的概念:
所谓的"对象"是指现实世界中的一切事物。c++中说,“万物皆对象”。文章源自随机的未知-https://sjdwz.com/11096.html
2.类的概念:
“类”是用户自定义的数据类型,可以理解为c语言中结构体中的延伸和扩展。它拥有着自己的特征属性,被称为,“数据成员”,还有行为特征,被称为,“成员函数”。而我们熟悉的结构体中,只包括数据成员,实际在其中写成员函数,也不会报错的。文章源自随机的未知-https://sjdwz.com/11096.html
3.类和对象的关系:
在现实生活中,自行车,摩托车等都拥有着一些相似的属性和行为特征,我们可以把这些对象抽象封装成类。类是对象的抽象,对象是类的实例化。文章源自随机的未知-https://sjdwz.com/11096.html
4.类的声明和定义:
在定义结构体时我们用的关键字是,struct,而C++在定义类时有了新的关键字class。
其定义语法是,class+类名+
{
修饰词:
数据成员;
成员函数;
};(注意别忘了分号)
如,我们定义一个点类:文章源自随机的未知-https://sjdwz.com/11096.html
class Point
{
public:
Point()
{
cout << "没有参数的构造函数被调用了" << endl;
x = 1;
y = 2;
}
Point(int m, int n)
{
cout << "有两个参数的构造函数被调用了" << endl;
x = m;
y = n;
}
void display()
{
cout << "-----------------**************--------------";
cout<< endl;
cout << "点的坐标是" << "(" << x << ", " << y << ")" ;
cout<< endl;
cout << "-------------------**************--------------"; cout<< endl;
}
~Point()
{
cout << "析构函数被调用了" << endl;
}
private:
int x;//点的横坐标
int y;//点的纵坐标坐标
};
在写代码时我们可以把成员函数在声明中便写出来,但是这样不便于阅读,也不美观,我们可以把声明和定义分开:文章源自随机的未知-https://sjdwz.com/11096.html
class Point
{
public:
Point();
Point(int m, int n);
void display();
~Point();
private:
int x;//点的横坐标
int y;//点的纵坐标坐标
};
Point::Point()
{
cout << "没有参数的构造函数被调用了" << endl;
x = 1;
y = 2;
}
Point::Point(int m, int n)
{
cout << "有两个参数的构造函数被调用了" << endl;
x = m;
y = n;
}
void Point::display()
{
cout << "-----------------**************--------------";
cout<< endl;
cout << "点的坐标是" << "(" << x << ", " << y << ")" ;
cout<< endl;
cout << "-------------------**************--------------"; cout<< endl;
}
Point::~Point()
{
cout << "析构函数被调用了" << endl;
}
在类外定义成员函数时要声明函数的作用域,用作用域限定符“::”双冒号。
我们定义了一个点类,class是创建类时的关键字,Point是类名,类名只要命名合法即可。public和private是数据成员或者成员函数的访问权限,下面会具体介绍。文章源自随机的未知-https://sjdwz.com/11096.html
5.数据成员或者成员函数的访问权限:
如上面的点类,类里有两个关键字,是public和private,这些就是声明数据成员和成员函数访问权限的关键字。
这些修饰词有三个,public,protected,private。
public是公有的,在类内或者类外均可以被访问的。
protected是受保护的,在类内和继承(先不用了解此概念)该类的类中可以被访问。
private是私有的,只能在类内被访问。文章源自随机的未知-https://sjdwz.com/11096.html
6.构造函数和析构函数:
构造函数:
构造函数是在创建对象时自动被调用的,不用自己去写,便会自己调用,当用类定义一个对象时便会自动执行,是隐式执行的。构造函数没有返回值,当然就没有返回类型,可以有参数也可以没有,没有参数的叫做默认构造函数,而多个构造函数就完成了对构造函数的重载,在定义对象时,会按照传来参数的不同,调用不同的构造函数。
构造函数与类名相同,如上面我定义的点类,Point()就是没有参数的构造函数,即默认构造函数,Point(int m,int n);就是有两个参数的构造函数。
构造函数的功能是给对象中的成员初始化。
构造函数有两种方式写文章源自随机的未知-https://sjdwz.com/11096.html
1.普通方式
请看上面点类中函数的定义实例。
2.初始化表的格式
如上面那个点类有两个参数的构造函数可以如此写:
前面一样,不同的是,赋值时,在函数名整体后+冒号+赋值变量1(值1)+赋值变量2(值2)+…文章源自随机的未知-https://sjdwz.com/11096.html
Point::Point(int m, int n):x(m),y(n)
{
cout << "有两个参数的构造函数被调用了" << endl;文章源自随机的未知-https://sjdwz.com/11096.html
}
析构函数:
析构函数的声明格式是,~类名();波浪线+类名+英语半角的小括号。
析构函数没有参数,没有返回值,也不能重载。
析构函数完成的功能是对对象的销毁,以免内存一直被占用。当该对象到达生存周期时便会被销毁。
如上面的点类~Point()便是析构函数,因为我没有动态申请空间,所以没有必要写delete 动态申请的内存。
如果在程序中我们并没有写构造函数和析构函数,系统会自动帮我们生成。
在实际编写代码时我们没有必要写构造函数和构造函数中的文字,此处是为了读者能够看到是隐式调用而写的。文章源自随机的未知-https://sjdwz.com/11096.html
7.对象访问成员
对象在访问成员时,可以用对象加.(点)即成员访问符号,也可以使用引用,指针方式可以使用指针访问符号。
主函数中有如下代码:文章源自随机的未知-https://sjdwz.com/11096.html
Point a;//隐式调用默认构造函数
Point b(1, 3);//隐式调用有两个参数的构造函数
Point &c = a;//引用
Point *ptr = &b;//指针ptr指向b
a.display();//成员访问符访问成员函数
cout << endl; b.display();//成员访问符访问成员函数 c.display();//成员访问符访问成员函数文章源自随机的未知-https://sjdwz.com/11096.html
文章源自随机的未知-https://sjdwz.com/11096.html
ptr->display();//指针访问符访问成员函数
运行结果如下:
这里写图片描述
通过此图可以看出构造函数和析构函数是隐式调用的。
也可以看到成员运算符(访问符)和指针访问符的功能。文章源自随机的未知-https://sjdwz.com/11096.html
因本文是还没开通本网站所写,排版可能有所问题,可以去CSDN查看本文文章源自随机的未知-https://sjdwz.com/11096.html
https://blog.csdn.net/qq_41243472/article/details/78691514?spm=1001.2014.3001.5501文章源自随机的未知-https://sjdwz.com/11096.html