C++系统学习(3)

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

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

猜你喜欢

转载自blog.csdn.net/louishao/article/details/77950312