以狗类为例认识类
Dog.h
/*
Dog.h用来声明类
*/
#include<iostream>
using namespace std;//一般.h文件只声明不定义,不需要这个头文件,但是这里为了举例类内定义成员函数,要用到该头文件的函数
class Dog //关键字和类名
{
public: //暴露的成员和函数
//数据成员(属性)
char name[20];
int age;
//成员函数(方法)
void speak() //在类中定义成员函数
{
cout << name << ":wangwang" << endl;
}
void run();
private: //隐藏的成员和函数
int weight;
void eating();
};
/*dog不止这些属性和方法,但把其他细节封装隐藏起来,只露出用户关心的内容。
但如果罗列出了所有内容,那么用户如何把关心内容暴露出来,其他内容隐藏起来呢?
这就要用到 访问限定符public(公共的),protected(受保护的),private(私有的)。这就是封装
*/
Dog.cpp
//在类外并且是分文件定义成员函数(才是正规办法;唯一例外,在vs编译环境中,类模板的成员函数不能分开到.h和.cpp两个文件里,应该都写到.h里,否则编译无法通过)
#include"Dog.h"
#include<iostream>
using namespace std;
void Dog::run()
{
cout << name << " run" << endl;
eating();//私有成员在类内可以使用
}
void Dog::eating()
{
cout << "eat" << endl;
weight = 1;
}
demo.cpp
#include<iostream>
#include<stdlib.h>
#include"Dog.h" //""是自己编的文件。<>是系统的文件
using namespace std;
int main()
{
//从栈中实例化一个对象
Dog d1;
Dog d2[10];
d1.age = 1;
strcpy(d1.name,"acai");
d1.run();
d1.speak();//调用了这4个公有成员
//从堆中实例化一个对象(new和delete)
Dog *q = new Dog(); //在new一个类的对象时,若类里没有自己定义默认构造函数,那么加括号()对象的值会初始化为0,不加()不初始化。否则不管加不加()都会根据构造函数被初始化。
Dog *p = new Dog[20];
//记得考虑申请失败的情况!
if (q == NULL){
return 0;
}
if (p == NULL){
return 0;
}
//赋初值
q->age = 2;
strcpy(q->name,"yellow");
strcpy(p[0].name,"black");
p[0].run();
//释放内存
delete q;
delete []p;
p = NULL;
q = NULL;
system("pause");
return 0;
}
结果如下: