C++学习笔记_02类和对象 2021-04-15

简介: C++学习笔记_02类和对象 2021-04-15
//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 个数据成员:
    会员卡号,会员姓名,会员电话, 会员余额
    +静态成员保存会员总数
   成员函数: 注册会员, 会员充值,会员消费
   要求:注册会员时候,使用静态函数生成一个唯一的会员卡号
*/
相关文章
|
25天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
83 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
80 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
88 4
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
31 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
32 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
26 1
|
2月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
2月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
2月前
|
存储 编译器 C语言
【C++类和对象(上)】—— 我与C++的不解之缘(三)
【C++类和对象(上)】—— 我与C++的不解之缘(三)