1.struct
当单一变量无法完成描述需求的时候,结构体类型解决了这一问题。可以将多个类型打包成一体,形成新的类型。这是 c 语言中封装的概念。
#include <iostream>
using namespace std;
struct Date
{
int year;
int month;
int day;
};
void init(Date &d)
{
cout<<"year,month,day:"<<endl;
cin>>d.year>>d.month>>d.day;
}
void print(Date & d)
{
cout<<"year month day"<<endl;
cout<<d.year<<":"<<d.month<<":"<<d.day<<endl;
}
bool isLeapYear(Date & d)
{
if((d.year%4==0&&d.year%100 != 0) || d.year%400 == 0)
return true;
else return false;
}
int main()
{
Date d;
init(d);
print(d);
if(isLeapYear(d))
cout<<"leap year"<<endl;
else
cout<<"not leap year"<<endl;
return 0;
}
对C语言中结构体的操作,都是通过外部函数来实现的。比如
void init(Date &d);
void print(Date &d);
bool isLeapYear(Date &d);
2.封装的访问属性
访问属性 | 属性 | 对象内部 | 对象外部 |
---|---|---|---|
public | 公有 | 可访问 | 可访问 |
protected | 保护 | 可访问 | 不可访问 |
private | 私有 | 可访问 | 不可访问 |
struct 中所有行为和属性都是 public 的(默认)。C++中的 class 可以指定行为和属性的访问方式。
封装,可以达到,对内开放数据,对外屏蔽数据,对外提供接口。达到了信息隐蔽的功能。
比如我们用 struct 封装的类,即知其接口,又可以直接访问其内部数据,这样却没有达到信息隐蔽的功效。而 class 则提供了这样的功能,屏蔽内部数据,对外开放接口。
3.用class去封装带行为的类
class 封装的本质,在于将数据和行为,绑定在一起然后能过对象来完成操作。
#include <iostream>
using namespace std;
class Date
{
public:
void init(Date &d);
void print(Date &d);
bool isLeapYear(Date &d);
private:
int year;
int month;
int day;
};
void Date::init(Date &d)
{
cout<<"year,month,day:"<<endl;
cin>>d.year>>d.month>>d.day;
}
void Date::print(Date &d)
{
cout<<"year month day"<<endl;
cout<<d.year<<":"<<d.month<<":"<<d.day<<endl;
}
bool Date::isLeapYear(Date &d)
{
if((d.year%4==0 && d.year%100 != 0) ||d.year%400 == 0)
return true;
else return false;
}
int main()
{
Date d;
d.init(d);
d.print(d);
if(d.isLeapYear(d))
cout<<"leap year"<<endl;
else cout<<"not leap year"<<endl;
return 0;
}
Date 类 访问自己的成员,可以不需要传引用的方式
封装有2层含义(把属性和方法进行封装对属性和方法进行访问控制)
Public修饰成员变量和成员函数可以在类的内部和类的外部被访问。
Private修饰成员变量和成员函数只能在类的内部被访问。
4.struct和class关键字区别
-
在用struct定义类时,所有成员的默认属性为public
-
在用class定义类时,所有成员的默认属性为private
5.新手常犯错误
#include<iostream>
using namespace std;//c++的命名空间
class circle2
{
public:
double m_r;
double pi = 3.1415926;
//千万不要这样子返回,必错,必须写在一个get函数中
double area = pi*m_r*m_r;//面积
double girth = 2 * pi * m_r;//周长
double getArea();
};
double circle2::getArea(){
double area = pi * m_r * m_r;
return area;
}
int main(void)
{
circle2 pi;
cout<<"请输入半径"<<endl;
cin>>pi.m_r;
cout<<pi.area<<endl;//乱码
cout<<pi.girth<<endl;//乱码
pi.area = pi.getArea();
cout<<pi.area<<endl;
return 0;
}

因为m_r area girth
的值在代码创建阶段就已经赋值了,m_r初始值是随机,所以area和girth都是随机,而改变了m_r了值,并不改变area和girth的值!所以会乱码!
6.程序设计方法的发展历程
面向过程的结构化程序设计方法







网友评论