1、面向对象技术的基本概念
对象、类和继承
2、C++中的空类默认产生哪些类成员函数?
对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数。
3、类和结构结构
类和结构的区别:
class中变量默认是private,struct中变量默认是public。C++中的关键字struct是为了让C++编译器兼容以前用C开发的项目。
struct也可以有:构造函数、析构函数、之间也可以继承等等。
以下代码用struct实现:
#include<iostream>
using namespace std;
enum BREED {GOLDEN,CAIRN,DANDIE,SHETLAND,DOBERMAN,LAB};
struct Mammal
{
public:
Mammal()
:itsAge(2),itsWeight(5)
{
}
~Mammal()
{
}
int GetAge() const
{
return itsAge;
}
void SetAge(int age)
{
itsAge = age;
}
int GetWeight() const
{
return itsWeight;
}
void SetWeight(int weight)
{
itsWeight = weight;
}
void Speak() const
{
cout<<"\nMammal sound !";
}
void Sleep() const
{
cout<<"\n Shhh.I'm sleeping. ";
}
protected:
int itsAge;
int itsWeight;
};
struct Dog : public Mammal
{
public:
Dog()
:itsBreed(GOLDEN)
{
}
~Dog()
{
}
BREED GetBreed() const
{
return itsBreed;
}
void SetBreed(BREED breed)
{
itsBreed = breed;
}
void WagTail() const
{
cout<<"Tail wagging...\n";
}
void BegForFood() const
{
cout<<"Begging for food...\n";
}
private:
BREED itsBreed;
};
int main()
{
Dog fido;
fido.Speak();
fido.WagTail();
cout<<"Fido is "<<fido.GetAge()<<" years old \n";
return 0;
}
4、成员变量
哪一种成员变量可以在同一个类的实例之间共享?
静态成员变量在一个类的所有实例间共享数据。如果想限制对静态成员变量的访问,则必须把他们声明为保护型或私有型。不允许用静态成员变量去存放某一个对象的数据。静态成员数据是在这个类的所有对象间共享的。
5、静态成员变量的使用。代码如下:
#include<iostream>
using namespace std;
class Cat
{
public:
Cat(int age)
:itsAge(age)
{
HowManyCats++;
}
virtual ~Cat()
{
HowManyCats--;
}
virtual int GetAge()
{
return itsAge;
}
virtual void SetAge(int age)
{
itsAge = age;
}
static int GetHowMany()//静态成员函数
{
return HowManyCats;
}
private:
int itsAge;
static int HowManyCats;//静态成员变量
};
int Cat::HowManyCats = 0;//静态成员变量的初始化
void tele();
int main()
{
const int MaxCats = 5;
int i;
Cat* CatHouse[MaxCats];//声明对象数组
for(i=0; i<MaxCats; i++)
{
CatHouse[i] = new Cat(i);//初始化对象数组
tele();
}
for(i=0; i<MaxCats; i++)
{
delete CatHouse[i];//释放对象数组空间
tele();
}
return 0;
}
void tele()
{
cout<<"There are "<<Cat::GetHowMany()<<" Cats alive!\n";
}
6、初始化列表
初始化列表的初始化变量顺序是根据成员的声明顺序来执行的。示例代码如下:
#include<iostream>
#include<string>
using namespace std;
class Base
{
private:
// int m_i;
// int m_j;
//如果将声明顺序改变一下,就会得到不同的结果
int m_j;
int m_i;
public:
Base(int i)
:m_j(i),m_i(m_j)//按声明的顺序初始化,故m_i会被赋予一个机值
{
}
Base()
:m_j(0),m_i(m_j)
{
}
int get_i()
{
return m_i;
}
int get_j()
{
return m_j;
}
};
int main()
{
Base obj(98);
cout<<obj.get_i()<<endl
<<obj.get_j()<<endl;
return 0;
}