C++系统学习(3)

来源:互联网 发布:淘宝导航图片 编辑:程序博客网 时间:2024/05/18 01:16

看完函数,接下来就是最重要的类和面向对象编程。由于该部分知识点至关重要,所以,我新开一博文记录。

在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 256class 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型字符串数组,这样更安全。)