2019.01.03 C++学习
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、析构器&构造器
2、访问控制-C++提供了一种用来保护类里的方法和属性的手段!
public protected private
- 在编写类定义代码时,应该从Public:开始写,然后是protected:,最后是private
3、覆盖方法&重载方法
重载机制使你可以定义多个同名的方法(函数),只是它们的输入参数必须不同。(因为编译器是依靠不同的输入参数来区分不同的方法)。
- 对方法(函数)进行重载一定要有的放矢,重载的方法(函数)越多,程序就越不同意看懂。
- 对方法进行覆盖(注意区分覆盖和重载)时一定要看仔细,因为只要声明的输入参数和返回值与原来不一致,你编写出来的就将是一个重载方法而不是覆盖方法。
- 继承之后不能重载;
4、友元关系
一个完全无关的类由于某些特殊的原因需要访问到某个protected或private成员,怎么办?如果把所有的东西都声明成public,这样虽让能达到目的,但是就把原来设法保护的方法或属性又暴露出来了!!!
友元关系式类之间的一个特殊关系,这种关系允许不仅允许友元类访问对方的public方法和属性,还允许友元访问对方的protected和private方法和属性。使用友元关系时,只要在类声明里的某个地方加上一条friend class**就行了
2019.01.04 C++学习
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、静态对象和静态方法
面对对象编程技术的一个重要特征是用一个对象把数据和对数据处理的方法封装在一起。对象(也可以说某个类的实例)来调用方法,每个方法只处理调用它的那个对象所包含的数据,所有的数据都属于同一个对象。如果我们所需要的功能或数据不属于某个特性的对象,而是属于整个类的,该怎么办?
举个例子:
假设现在需要统计一下有多少只活的动物,那么我们就需要有一个计数器的变量:每诞生一直宠物就给宠物的计数器加1,每挂掉一只,就减去1;我们首先想到的是创建一个全局变量来充当这个计数器,但这么做的后果是程序中任何的代码都可以修改这个计数器,稍不小心就会在程序里留下一个难以排查的漏洞!!!我们真正需要的是一个只在创建或删除对象时候才允许访问的计数器。这个问题必须使用C++的静态属性和静态函数才能完美地得到解决。C++允许我们把一个或多个成员声明为属于某个类,而不是仅属于该类的对象。
这么做的好处是程序员可以在没有创建任何对象的情况下调用有关的方法。另一个好处是能够让有关的数据仍在该类的所有对象间共享。
#include <iostream>
#include <string>
class Pet
{
public:
Pet(std::string theName);
~Pet();
static int getCount();
protected:
std::string name;
private:
static int count;
};
class Dog : public Pet
{
public :
Dog(std::string theName);
};
class Cat : public Pet
{
public:
Cat(std::string theName);
};
int Pet::count = 0; //1.编译器为count分配内存;2.把count这个变量初始化为0;
Pet::Pet(std::string theName)
{
name = theName ;
count++;
std::cout<<"一只宠物出生了,它的名字叫:"<<name<<"\n";
};
Pet::~Pet() // Pet的析构器
{
count--;
std::cout<<name<<"挂掉了\n";
}
int Pet::getCount()
{
return count;
}
Dog::Dog(std::string theName) : Pet(theName)
{
}
Cat::Cat(std::string theName) : Pet(theName)
{
}
int main()
{
Dog dog("Tom");
Cat cat("Jerry");
std::cout<<"\n已经诞生了"<<Pet::getCount()<<"只宠物!\n\n";
{ //大括号的作用
Dog dog_2("Tom_2");
Cat cat_2("Jerry_2");
std::cout<<"\n现在呢,已经诞生了"<<Pet::getCount()<<"只宠物!\n\n";
}
std::cout<<"\n现在还剩下"<<Pet::getCount()<<"只宠物!\n\n";
getchar();
//system("pause");
return 0;
}
运行结果如下图所示: