c++类和对象基本概念
1.什么是类?什么是对象?两者的区别是什么?
类是抽象的,对象是具体的的,对象是类的一个实例,对象继承类的方法和属性。
举个例子:人是一个类,它是抽象,那什么是对象呢?那就是具体指的哪个人,比如小红、小明,这就是对象,人有外貌特征和行为,比如鼻子、耳朵、眼睛
2.代码分析
#include<iostream>
#include<string>
using namespace std; //使用std命名空间
struct Hero
{
char name[64];
int id;
};
void printHero(Hero &h)
{
cout << "name=" << h.name << endl;
cout << "id=" << h.id << endl;
}
class SuperHero
{
public://访问权限控制
char name[64];
int id;
void printHero()
{
cout << "name=" << name << endl;
cout << "id=" << id << endl;
}//类内部函数(方法)调用 类内部变量时,不需要传参,可以直接调用
//因为都是在同一个类的内部,函数内调用的变量会直接在类内部匹配,且不会发生歧义,类内部函数又被叫做方法
};
class Dog
{
public: //public权限时,在类的内部和外部都可以直接访问类里面的变量和方法(函数)
char name[64];
char color[64];
void printDog(int age) //函数内的age为外部调用函数时传进来的参数
{
this->age = age; //表示这个类内部定义的age, this->age 和 int age是两个不同的变量
cout << "age=" << this->age << endl;
cout << "name=" << name << endl;
cout << "color=" << color << endl;
}
private: //private权限时,只有类内部可以访问此权限下的变量和方法
int age;
protected: //protected权限时,在单个类中,和private关键字的权限是一样的。只有在类的继承 中,才和private有区别
};
class Date
{
public:
void initDate(int year, int month, int day)
{
this->year = year;
this->month = month;
this->day = day;
}
void printDate()
{
cout << "year=" << year << endl;
cout << "month=" << month << endl;
cout << "day=" << day << endl;
}
bool isLeapYear()
{
if((year % 4 == 0 && year % 100)||(year % 400 == 0))
{
cout << year << "is leap year" << endl;
return true;
}
cout << year << "is not leap year" << endl;
return false;
}
//为了获取和改变类的私有变量,C++统一了命名方法,get...()和set...()
//将数据成员私有化,提供Getter和Setter来访问,即所谓的"封装"
int GetYear()
{
return year;
}
int SetYear(int year)
{
this->year = year;
}
private:
int year;
int month;
int day;
};
//一个类的成员变量默认访问权限为private,类的本质是一个类型,对象的本质是变量
class Date1
{
int year;
};
//一个结构体的成员变量的默认访问权限为public
struct Date2
{
int year;
};
int main()
{
Hero h = {"zhouhao",25};
printHero(h);
//SuperHero是一种类型,被叫做类,hero是一个SuperHero的变量,被叫做对象
SuperHero hero;
hero.id = 100;
strcpy_s(hero.name, sizeof("zhouhaohao")+1,"zhouhaohao");
hero.printHero();
Dog dog;
//因为Dog类里的成员变量color和name都是public权限,所以在类外部可以做直接对这两个类的内部成员赋值
strcpy_s(dog.color, strlen("yellow")+1, "yellow");
strcpy_s(dod.name, strlen("dahuang")+1, "dahuang");
//在类的外部不可以直接访问类内部private权限下的变量和方法(函数),但可以通过调用public权限下的方法对私有变量进行访问修改
dog.printDog(3);
Date date;
int year, month, day;
cin >> year >> month >> day;
date.initDate(year,month,day);
date.printDate();
date.isLeapYear();
//封装的方法改变year的值
date.SetYear(2018);
cout << date.GetYear() << endl;
return 0;
}
3.参考