五、类和对象、程序设计方法

2018-06-04  本文已影响0人  木鱼_cc

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关键字区别

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;
}

1.png

因为m_r area girth的值在代码创建阶段就已经赋值了,m_r初始值是随机,所以area和girth都是随机,而改变了m_r了值,并不改变area和girth的值!所以会乱码!

6.程序设计方法的发展历程

面向过程的结构化程序设计方法

2.jpg 3.png 4.jpg 5.jpg 6.png 7.jpg 8.jpg
上一篇 下一篇

猜你喜欢

热点阅读