看完函数,接下来就是最重要的类和面向对象编程。由于该部分知识点至关重要,所以,我新开一博文记录。
在C++中,可以使用struct和class进行类的设计和编写,那两者的区别和联系是什么呢?直接上例子讲解!
// 本程序和总结,参考自:http://blog.csdn.net/misayaaaaa/article/details/55195496
// 感谢该博主的分享!!
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Student
{
Student(string name,int age, int score); // 构造函数
string m_name;
int m_age;
int m_score; // 定义三个变量
void showname() // 定义一个函数
{
cout << m_name << "的年龄是:"<<m_age << ",得分为:"<< m_score <<endl;
} // 类内定义的函数,编译器会优先视为内联函数
};
Student::Student(string name, int age, int score):m_name(name),m_age(age),m_score(score){}
//成员函数初始化列表,将name赋给m_name,改变类内变量
// 利用struct定义类
struct Students
{
Students(string name, int age, int score); // 构造函数
string m_name;
int m_age;
int m_score; // 定义三个变量
void shownames() //
{
cout << m_name << "的年龄是:"<< m_age << ",得分为:"<< m_score <<endl;
}
};
Students::Students(string name, int age, int score):m_name(name),m_age(age),m_score(score){}
// 列表初始化,覆盖类的内部变量
int main(int argc, char **argv)
{
Student s("小明",18,3); // 报错,使用class,默认是private,外部不可访问
Students s2("小红",20,4); // 正常
s2.shownames();
return 0;
}
运行代码:
发现报错了,而且提示Student::student,无法访问private成员;当我们把对应行给注释了,之后,我们再运行。
再次运行的截图:
结果成功运行。
总结:
1、class创建时,其数据访问控制默认是private的,即外部不可访问;struct创建时,其数据访问控制默认是public的,即公开外部可访问。
2、如果想做得更像一种数据结构,使用strcut;如果想做得像对象,则使用class!
3、对于访问控制,应该在程序里明确指出,而不是依靠默认!
一个简单的类的实例。
开发一个程序,分别定义学生类(CStudent)。要求: (1)在CStudent类中包含“姓名”、“性别”、“年级”、“班级”数据成员。 (2) 在CStudent类中神功成员函数SetInfor,该函数的作用是设置成员变量的数值。 (3)在CStudent类中声明ShowInfor函数,将其中的数据信息输出。
代码实现(使用了C型字符串数组,使用string类型写起来应该会更简单)
CStudent.h文件:
#include<iostream>
using namespace std;
#define MAXLEN 256
class CStudent
{
public:
CStudent();
//~CStudent();
void SetInfor(char *s,char*q,char *p,char *z);
void ShowInfor();
private:
char *name;
char *sex;
char *grade;
char *banji;
};
CStudent::CStudent()
{
name = new char[MAXLEN];
sex = new char[MAXLEN];
grade = new char[MAXLEN];
banji = new char[MAXLEN];
}
void CStudent::SetInfor(char *s,char*q,char *p,char *z)
{
name = s;
sex = q;
grade = p;
banji = z;
}
void CStudent::ShowInfor()
{
int i = 0;
cout << "Name: ";
while(name[i]!='\0')
{
cout << name[i];
++i;
}
i=0;
cout << endl;
cout << "Sex: ";
while(sex[i]!='\0')
{
cout << sex[i];
++i;
}
i=0;
cout << endl;
cout << "Grade: ";
while(grade[i]!='\0')
{
cout << grade[i];
++i;
}
i=0;
cout << endl;
cout << "Class: ";
while(banji[i]!='\0')
{
cout << banji[i];
++i;
}
cout << endl;
}
/*
CStudent::~CStudent()
{
delete [] name;
delete [] sex;
delete [] grade;
delete [] banji;
}
*/
main.cpp中:
#include "CStudent.h"
int main()
{
CStudent s1;
char s[20] = "Louis Hao";
char q[20] = "female";
char p[20] = "Yan 1";
char z[20] = "3";
s1.SetInfor(s,q,p,z);
s1.ShowInfor();
}
运行结果:
在这里,我是打算把析构函数也用上的,但是加上析构函数后,会报错,报的"Debug Assertion Failed",Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
我认为,这是内存泄漏造成的。当程序退出时,系统会回收分配的内存,就会调用析构函数,由于内存已经被错误地释放了,于是报错。(由于使用了new一般都会使用delete,很难发觉以上这个问题,特别是程序很大的时候。而我们可以使用string类型替代C型字符串数组,这样更安全。)