前言
今天继续和类撕逼,讲一讲类的性质和一些用法
一、类成员的属性?
在我们创建一个类之后,如果不声明属性的话那默认属性就是private。我们来看下所有的属性和性质:
private:私有的数据和方法,类的内部可以使用。
public:公有的数据和方法,类的外部可以使用。
protected:受保护的数据和方法,本类和派生的类可以使用(在讲派生类的时候会提到)。
我们来看一下这三个属性的实例吧:
#include <iostream>
using namespace std;
class test
{
private:
int a = 1;
public:
void fun()
{
cout<<a<<endl;
}
void fun1(int num)
{
a = num;
cout<<num<<endl;
}
public:
int b = 2;
protected:
int c = 3;
};
int main()
{
test lishuo;
cout<<lishuo.a<<endl;
lishuo.fun();
lishuo.fun1(2);
}
输出:
lishuo.cpp: In function ‘int main()’:
lishuo.cpp:25:15: error: ‘int test::a’ is private within this context
25 | cout<<lishuo.a<<endl;
| ^
lishuo.cpp:6:6: note: declared private here
6 | int a = 1;
| ^
注释该行:
1
2
所以类的内部是可以任意访问私有属性的。
示例2:
练习:定义类 向数组中输入整数 并求出数组元素中的最大值,最小值和平均值
1.数组成员变量private修饰
2.成员函数input(int length)输入数组的值和数组长度 动态创建(根据当前的逻辑创建)new
3.成员函数max 要求带返回值
4.成员函数min
5.成员函数agv
代码:
#include <iostream>
using namespace std;
class test
{
private:
int *p;
int length;
public:
void input(int num)
{
p = new int[num];
for(int i = 0;i < num;i++)
{
cin>>p[i];
}
length = num;
}
int max()
{
int a = p[0];
for(int i = 0;i < length;i++)
{
if(p[i] > a)
{
a = p[i];
}
}
return a;
}
int min()
{
int a = p[0];
for(int i = 0;i < length;i++)
{
if(p[i] < a)
{
a = p[i];
}
}
return a;
}
int avg()
{
int sum = 0;
for(int i = 0;i < length;i++)
{
sum += p[i];
}
return sum/length;
}
};
int main()
{
test lishuo;
lishuo.input(4);
cout<<lishuo.max()<<endl;
cout<<lishuo.min()<<endl;
cout<<lishuo.avg()<<endl;
}
输出:
1 2 3 4
4
1
2
二、
2.后期C++项目分文件写
在后期的项目中往往.cpp/.h文件不是只有一个,这个时候把所有的类都放在一个文件里面写显然是不现实的,这个时候就可以分文件写,比如我现在有main.cpp用来存放主函数,lishuo.h用来存放类的声明,lishuo.cpp用来存放类方法的实现,那么我就可以这样写:
main.cpp:
#include<iostream>
#include"lishuo.h"
using namespace std;
int main()
{
person lishuo;
lishuo.setnum(5);
lishuo.show();
}
lishuo.h
#ifndef PERSON_H
#define PERSON_H
class person
{
private:
int a;
public:
void setnum(int num);
void show();
};
#endif
lishuo.cpp
#include<iostream>
#include"lishuo.h"
using namespace std;
void person::setnum(int num)
{
a = num;
}
void person::show()
{
cout<<a<<endl;
}