8.2 类和对象的使用
#include <iostream> #include <cstring> using namespace std; struct Student //默认是公有权限 { int age; char *name; }; class Student1 //默认是私有权限,只能在类的内部访问 { public: //声明下面的成员为公有属性 int age; //类的成员变量 属性 char *name; void print() //类的成员函数 方法 { cout<<"age = "<<age<<" name = "<<name<<endl; } }; int main(int argc, char const *argv[]) { /* Student s1; s1.age = 1; */ Student1 s1; s1.age = 1; s1.name = new char[32]; strcpy(s1.name,"zhangsan"); s1.print(); return 0; }
8.3 类的访问权限
访问级别由 public protected private 三个关键词组成,在使用三个关键词前,我们首先要了解类的外部和类的内部的概念。
public:公有属性,凡是在它下面定义的,类的内部和外部都可以访问 protected::保护属性,凡是在它下面定义的,在继承关系中,可以在子类中访问 private:私有属性,凡是在它下面定义的,只能在类的内部访问。
#include <iostream> using namespace std; class Test { private: //私有属性,只能在类的内部访问 int a; void f1(){} protected://保护权限,用于继承,类的外部不能访问 int b; void f2(){} public: //公有权限,类的内部和外部都可以访问 int c; void f3(){} private: //同一个关键词可以出现多次 int e; }; int main(int argc, char const *argv[]) { Test t1; //Test:类 t1:对象 //t1.a = 1; //私有成员不能在类的外部访问 t1.c = 200; return 0; }
8.4 类中的元素说明
#include <iostream> using namespace std; class Circle { private: int m_r; //属性 double m_s; public: void SetR(int r) //成员函数 方法 { m_r = r; } double Gets() { m_s = 3.14*m_r*m_r; return m_s; } }; int main(int argc, char const *argv[]) { Circle c1; //创建对象 c1.SetR(100); cout<<c1.Gets()<<endl; return 0; }
8.5 类的使用案例
#ifndef _STUDENT_H_ #define _STUDENT_H_ #include <iostream> using namespace std; class Student { public: /** * @brief Get the Age object * * @return int */ int GetAge(); int GetID(); void SetAge(int a); void SetID(int i); private: int m_age; int m_id; }; #endif
#include "student.h" int Student::GetAge() { return m_age; } int Student::GetID() { return m_id; } void Student::SetAge(int a) { m_age = a; } void Student::SetID(int i) { m_id = i; }
#include "student.h" int main(int argc, char const *argv[]) { Student s1; s1.SetAge(18); s1.SetID(19); cout<<s1.GetAge()<<endl; return 0; }
练习
设计一个圆形类和一个点类,计算点在圆外,园内,还是圆上(点和圆的关系)
1>点: 属性:横坐标和纵坐标 方法:点和点的距离 2>圆: 属性:圆心,半径 方法:设置圆心和半径 判断点和圆的关系
#ifndef _CIRCLE_H_ #define _CIRCLE_H_ class Point { private: int m_x; int m_y; public: void SetXY(int x,int y); int Distance(Point &p); }; class Circle { private: Point m_center; //圆心 int m_r; public: void setC(int x,int y,int r); bool Judge(Point &p); }; #endif
#include "circle.h" int main(int argc, char const *argv[]) { Point p; p.SetXY(0,3); Circle c1; c1.setC(0,0,3); if(c1.Judge(p)) { cout<<"点在圆外或者圆上"<<endl; } else { cout<<"点在圆内"<<endl; } return 0; }
#include "circle.h" void Point::SetXY(int x,int y) { this->m_x = x; this->m_y = y; } int Point::Distance(Point &p) { int dis = (p.m_x - m_x)*(p.m_x - m_x) + (p.m_y - m_y)*(p.m_y - m_y); return dis; } void Circle::setC(int x,int y,int r) { m_center.SetXY(x,y); m_r = r; } bool Circle::Judge(Point &p) { if(p.Distance(m_center) >= m_r*m_r) { return true; } else { return false; } }
8.6 对象的构造和析构
8.6.1 构造函数
在c++中,有一种特殊的成员函数,名字和类名相同,没有返回值,不需要用户显示调用(也不能调用),而是在创建对象的时候自动执行. 几点说明: 1.构造函数的名字和类型必须相同 2.构造函数不能有返回值,不能有return语句 3.创建对象的时候自动执行,不能手动调用 4.主要用于对类的成员进行赋初值。(和初始化有区别)
#include <iostream> using namespace std; class Array { private: int size; //数组的容量 int *data; //数组首地址 public: Array(); //无参构造函数 void setVal(int Index,int value); int GetVal(int Index); ~Array(); }; Array::Array() { cout<<"Array的无参构造函数"<<endl; size = 5; data = (int *)malloc(sizeof(int)*size); } void Array::setVal(int Index,int value) { data[Index] = value; } int Array::GetVal(int Index) { return data[Index]; } Array::~Array() { cout<<"Array的析构函数"<<endl; if(data != NULL) { free(data); data = NULL; } } int main(int argc, char const *argv[]) { Array a1; //创建对象,自动调用构造函数 for(int i = 0 ; i < 5;i++) { a1.setVal(i,i+1); } for(int i = 0; i < 5;i++) { cout<<a1.GetVal(i)<<" "; } cout<<endl; return 0; }