文章目录
前言
C++精准知识讲解
提示:以下是本篇文章正文内容,下面案例可供参考
一、类的大小跟static的关系
更新类的大小:类的大小由类中所有非静态成员属性的大小决定(静态成员属性不占用类的大小,因为静态成员属性存放在数据段中)
代码实例:
#include <iostream>
using namespace std;
class Animal
{
public:
void getAnimal()
{
count++;
cout<<count<<endl;
}
private:
int age;
static float weight;
static int count; //static修饰的成员属性统计,或者用于对象之间传递数据
};
int Animal::count=0;
int main()
{
cout<<sizeof(Animal)<<endl;
Animal a;
a.getAnimal();
Animal b;
b.getAnimal();
Animal c;
c.getAnimal();
}
二、多态和虚函数底层原理分析
1.原理:
第一点:只要一个类中定义了虚函数,那么这个类以及它派生出来的类都会有各自独立的虚函数表,并且创建的对象中会多出来一个指针(该指针指向虚函数表的首地址)
第二点:父类的指针或者父类的引用去调用方法的时候,其实就是去查询虚函数表
2.C++中多态可以划分为两大类
第一类:编译时多态 --》函数重载就是编译时多态
第二类:运行时多态 --》我们现在用虚函数实现的这种就是运行时多态
3.代码实例
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void eat() //虚函数
{
cout<<"动物吃"<<endl;
}
virtual void animalSleep() //虚函数
{
cout<<"动物睡觉"<<endl;
}
void animalRun() //非虚函数
{
cout<<"动物跑"<<endl;
}
private:
int age;
};
class Dog:public Animal
{
public:
virtual void eat() //重写了父类其中一个虚函数,另一个没有重写
{
cout<<"狗吃骨头"<<endl;
}
};
class Tugou:public Dog
{
public:
virtual void eat()
{
cout<<"土狗吃火腿肠"<<endl;
}
};
//C++允许
void animalEat(Animal &animal) //希望具有通用性
{
animal.eat();
}
int main()
{
Dog dog;
Animal *p=&dog;
p->eat();
p->animalSleep();
cout<<sizeof(Animal)<<endl;
cout<<sizeof(dog)<<endl;
}
三、内部类----》类的嵌套
一个类的对象作为另外一个类的成员
代码实例
#include <iostream>
using namespace std;
//定义书的类
class Book
{
public:
Book()
{
}
Book(string newname)
{
bookname=newname;
}
private:
string bookname;
};
//定义读者类
class Reader
{
public:
void getBook(Book &newbook)
{
somebook=newbook;
}
private:
Book somebook; //调用无参构造函数
};
int main()
{
//定义一本书
Book book("红楼梦");
//定义一个读者
Reader reader;
reader.getBook(book);
}
四、纯虚函数和抽象类
1.纯虚函数
跟虚函数的关系: 纯虚函数是虚函数的一种特殊情况
语法: virtual 函数返回值 函数名字()=0; //纯虚函数没有任何具体代码,只有一个声明
作用: 提供一个统一接口,实现要求程序员根据自己的情况各自去实现
2.抽象类
定义:只要一个类中声明了纯虚函数,那么这个类就是抽象类
作用:跟纯虚函数配合,提供接口声明给程序员,提供给程序员提供的共同的操作接口,程序员依照统一的接口去实现各自的功能
特点:
特点一:抽象类是不能定义对象的
特点二:一个类继承了抽象类,必须实现抽象类中所有的纯虚函数,如果有一个不实现,那么子类依然是抽象类
3.代码实例
#include <iostream>
using namespace std;
class Dog; //前向引用声明,告诉编译器我有定义这个类,定义在后面
class Cat;
class Object //提供纯虚函数接口的
{
public:
virtual void compare(Dog &dog)=0; //定义一个纯虚函数
virtual void show()=0;
};
class Dog:public Object
{
public:
Dog(int _age)
{
age=_age;
}
void compare(Dog &dog) //实现纯虚函数,根据狗的特点自己去写比较方法的代码
{
if(this->age>dog.age)
cout<<"你的狗年龄大"<<endl;
else if(this->age<dog.age)
cout<<"你的狗年龄小"<<endl;
else
cout<<"你的狗年龄跟别人的一样"<<endl;
}
void show()
{
cout<<"狗自己实现了show方法"<<endl;
}
private:
int age;
float weight;
};
int main()
{
//Object obj; 错误,抽象类无法创建对象
Dog dog(5);
Dog dog1(7);
dog.compare(dog1);
}