//C++学习笔记_02类和对象 #include<iostream> #include<cstdio> #include<cstring> using namespace std; //类和结构体很类似。都用于定义一个数据结构 //类中定义变量(函数)都默认是private //结构体中 默认是public class CAnimal { friend void TestFriend(); //授权 TestFriend 这个函数,访问 CAnimal 的私有成员和protected 成员 //private只能在类的成员函数中调用,对象不能直接调用 信息隐藏 private://私有成员:在下面public的函数中,可以直接访问这些变量 char name[16]; //姓名 unsigned int age; //年龄 static unsigned int count; //static静态的成员变量 数量 public://公有成员:对象可以直接调用 CAnimal(); //构造函数,没有返回值:用于初始化成员变量 CAnimal(unsigned int age, char szName[]); //重载构造函数 ~CAnimal(); //析构函数,没有返回值:用于释放资源 void Print(); static unsigned int Count(); private: void IncAge(); //私有函数 public: unsigned int height; //身高 static unsigned int cntAge; //静态的成员变量 总年龄 protected: //保护成员:类中可以访问,子类中也可以访问,但是对象不能调用 void SetAge(int age);//更改年龄 }; // 函数前面必须加上CAnimal::,表示这个函数是CAnimal这个类中的成员函数 // 不加CAnimal::,这个函数就是一个普通的函数(全局函数) CAnimal::CAnimal(){ cout<<"构造 CAnimal-1 ..."<<endl; age=0; //这里就是给 private 里面的 age 赋值 memset(name, 0, sizeof(name)); //把一段内存数据清0 //一般,我们使用 malloc 申请一片内存后,memset(p, 0, sz); // 特殊用法:memset(p, 0xff, sz) -->内存所有bit位置为1 // 把p指向的内存段,sz个字节,每个字节都置为为某个值 count++; } CAnimal::CAnimal(unsigned int age, char szName[]){ cout<<"构造 CAnimal-2 ..."<<endl; //age=age; //这个 age 只得是入参age //我们要访问private里面定义的age,可以使用 this->age //这里this是一个指针,指向的是对象本身 this->age=age; //name=szName; 不允许这样赋值!!! strcpy(name,szName); count++; cntAge += age; } CAnimal::~CAnimal(){ cout<<"析构 CAnimal..."<< endl; count--; cntAge-=age; } void CAnimal::Print(){ cout<<"Animal Name: "<<name<< endl; cout<<"Animal Age : "<<age<< endl; cout<<endl; } void CAnimal::IncAge(){ age++; } void CAnimal::SetAge(int age){ this->age = age; } //类中的静态成员变量,不可以定义的时候初始化,也不可以在析构函数里初始化 //对于函数中定义的静态变量,函数每次调用的时候,是共用同一个变量 //对于类中定义的静态变量,是每一个对象,共用这个变量 //所以:类中静态变量的初始化方式是:在类的外部直接赋值进行初始化 unsigned int CAnimal::count = 0; unsigned int CAnimal::cntAge = 0; unsigned int CAnimal::Count(){ return count; } void TestAnimal(){ CAnimal A1; //A1 称之为 CAnimal 的一个对象。 //定义时候,调用构造函数 //函数退出,释放资源的时候,会调用析构函数 //析构函数是在整个函数执行完毕,return之前调用的 CAnimal A2(10, "MokeyA"); cout << "End of TestAnimal" << endl; cout << "A1:" << endl; A1.Print(); cout << "A2:" << endl; A2.Print(); //name 是 private 的成员,不可以通过对象直接访问 //cout<<"A2 name:"<<A2.name<<endl; //同样的,private 的函数,不可以通过对象直接访问 //和 age,name 一样,IncAge() 这个函数, //只能在类的成员函数中访问,不能通过对象调用 //A2.IncAge(); //protected 的成员,不可以通过对象直接访问 //A2.SetAge(8); //变量定义成pubilc ,可以直接访问 A2.height = 10; //静态变量的访问方式 类名::变量名 cout<<"现在 CAnimal 的总年龄:"<< CAnimal::cntAge << endl; //这里 count 是私有成员,不能直接 CAnimal::count //cout << "现在 CAnimal 对象的个数:" << CAnimal::count << endl; //--》定义一个共有函数来访问 Count cout<< "现在 CAnimal 对象的个数:"<< A1.Count()<< endl; //静态变量,通过对象调用公有函数访问,比较突兀,(容易混淆函数作用) //一般情况下,我们可以把 Count() 声明成 静态函数 //Count声明为静态函数后,我们就可以通过 CAnimal::Count() 来访问 cout<<"现在 CAnimal 对象的个数:"<<CAnimal::Count()<< endl; return; } void TestFriend(){ CAnimal A3(4, "很小的小狗"); A3.SetAge(6); A3.IncAge(); A3.Print(); strcpy(A3.name,"很小的大狗"); A3.Print(); } void TestStatic(){ static int x = 0; //只是在 TestStatic 第一次被调用的时候执行初始化 x++; cout << "static: x = " << x << endl; } int main() { CAnimal A0(5, "FishFriend"); TestAnimal(); TestStatic(); TestStatic(); TestStatic(); TestFriend(); system("pause"); return 0; } //2017.03.20 作业 (两个题目二选一): /* 1: 定义一个学生类Student,包括3个数据成员: 学号id,姓名name,分数score; 两个静态数据成员:总分total和学生人数count; 带参数的构造函数用来初始化对象, 成员函数ChangeScore用来修改分数, 静态成员函数GetAverage用来打印计算得到的平均分。 2: 定义一个 会员类 Vip,包含 4 个数据成员: 会员卡号,会员姓名,会员电话, 会员余额 +静态成员保存会员总数 成员函数: 注册会员, 会员充值,会员消费 要求:注册会员时候,使用静态函数生成一个唯一的会员卡号 */