c++中的类与对象

我们都知道,在c语言中,结构体是指一系列相同类型或者不同类型的数据构成的数据集合。
在c语言中我们将结构体定义为:

struct Student
{
    char name[20];//姓名
    char gender[3];//性别
    int age;//年龄
};

而我们知道,在c语言中,“数据”和”处理数据的操作(函数)”是分开的,语言本身并没有支持“数据和函数”之间的关联性。所以在c语言的结构体中,只能存放数据,定义变量,而不能定义函数。(此处不考虑定义一个指向函数的指针)

而在c++中,结构体内不仅可以定义变量,还可以定义函数。

struct Student
{
    char _name[20];
    char _gender[3];
    int _age;

    void StudentInfo(const char* name, const char* gender, int age)
    {
        strcpy(_name, name);
        strcpy(_gender,gender);
        _age = age;
    }
};

int main()
{
    Student s;
    s.StudentInfo("小明","男",18);
    return 0;
}

c语言中的struct与c++中的struct有什么区别

c语言中的struct只能保存数据,定义变量,不能定义函数 

c++中的struct可以定义变量或者函数

而在c++中,结构体的定义更喜欢用class来代替,我们称之为“类”。

1.类的概念及封装

类的定义:

class className
{
    类体  //由函数和变量组成
};

说明:
class是定义类的关键字;className是类名,{}内是类的主体;类定义结束时后面要加上分号。
类中的元素称为类的成员;类中的数据称之为类的属性或者类的成员变量;类中的函数称之为类的方法或者类的成员函数。

类的定义有两种方式:

1.类的声明和定义都放在类体中

class Test
{
public:
    Test()
    {
        cout << "Creat Test" << endl;
    }

    ~Test()
    {
        cout << "Destroy Test" << endl;
    }
};

2.类的声明放在.h文件中,类的定义放在.cpp文件中

*Test.h*

class Test
{
public:
    Test();

    ~Test();

};

*Test.cpp*

Test::Test ()
{
    cout << "Creat Test" << endl;
}

Test::~Test()
{
    cout << "Destroy Test" << endl;
}

c++中struct和class的区别

关于默认访问权限: 
class默认成员访问权限为private;而struct默认成员访问权限为public

关于继承方式:
class继承默认为private;而struct继承默认为public继承

class这个关键字还用于定义模板参数,就像typename。但关键字struct不用于定义模板参数。

封装:

c++的三种特征:封装,继承,多态

什么是封装:

隐藏对象的属性及实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合。

  • 第一层含义:封装是面向对象程序设计的基本属性。将数据和函数合为一体,这在计算机世界使用类和对象进行的。(把属性和方法进行封装)

  • 第二层含义:把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类或者对象操作,对不可信的进行信息的隐藏。(对属性和方法进行访问控制)

示例:

1.就比如说电脑,在电脑中有主板,cpu,网卡,内存等等,但是所有复杂的结构外装上一个机箱的外衣,当用户使用电脑时,不用知道电脑其内部结构,只用通过键盘输入,即可完成自己想要的操作。

2.函数也是一种封装,函数中的语句被封装在函数这个更大的实体中,被封装的实体隐藏了它们的实现细节,可以调用函数,但是不能访问其内部。

类的意义:

类是把属性和方法进行封装,同时对类的属性和方法进行访问控制。 

类是由我们根据客观事物抽象而成,形成一类事物,然后用类去定义对象,形成这类事物的具体个体。

类是一个数据类型,类是抽象的,而对象是一个具体的变量,是占用内存空间的。

类的作用域:

在c++中,我们已经学会了三种作用域–全局作用域,局部作用域,命名空间域,而类定义了一个新的作用域,类的所有成员必须处于类的作用域中。形参表和函数体位于类的作用域中。

{ }花括号以外称为类外,在类外定义成员必须使用”: :”作用域解析符指明成员属于哪一个类作用域;在类的作用域外,只能通过对象借助成员访问操作符“.”和”->”来访问类成员,跟在访问操作符之后的名字必须在相关联类的作用域里。

class Test
{
public:
    void Seta(int a )
    {
        int  _a = a;
    }
    void Printa()
    {
        cout << _a << endl;
    }
private:
    int _a;

};
int main()
{
    Test t;
    t.Seta(10);
    t.Printa();
    return 0;
}

在此,我们已经学到了c++中的四种作用域—全局作用域,局部作用域,命名空间域以及类作用域。

注意:成员变量在类的作用域中具有全局作用性。

相关面试题:

在使用一个变量前,必须先对其声明,但是咋上述Test类中,成员变量在函数之后,为什么编译器不报错?

这和编译器对类的识别有关,在编译器识别类时,顺序如下:
(1)识别类的类名
(2)识别类中的成员变量
(3)识别类的成员函数,并且对成员函数进行修改
因此变量定义在使用之后编译器也不会报告出错。

类的实例化:

用类类型创建对象的过程称之为类的实例化。

说明:
1.类知识一个相当于模型一样的东西,只是限定了类有哪些成员,定义一个类,并没有分配实际的内存空间来存储它。

2.一个类可以实例化多个对象,实例化出来的对象占用实际的物理空间存储类成员变量。

对象:

类是对象的抽象,对象是类的具体实例。

类是抽象的,不占用内存,而对象是具体的,占有内存空间。

例如:类就是水果,对象就是苹果。

类的对象模型:

类的对象模型是指类中各成员在内存中的布局形式

类中既有成员变量,又有成员函数,那么如何计算类的大小呢?(严格来说是类的对象的大小,因为类是一个类型定义,没有大小可言)

class person
{
public:
    void SetpersonInfo(char* name,char*gender,int age)
    {
        strcpy(_name, name);
        strcpy(_gender, gender);
        _age = age;
    }

    void Printperson()
    {
        cout << _name << "" << _gender << "" << _age << endl;
    }
private:
    char _name[20];
    char _gender[3];
    int _age;
};


int main()
{
    cout << sizeof(person) << endl;

    return 0;
}

对于上述代码,其运行结果为:
这里写图片描述
结论:一个类的大小就是类中“成员变量”之和。

对于一个空类,它的大小又是多少呢?

class Emptyclass
{};


int main()
{
    //cout << sizeof(Test) << endl;
    cout << sizeof(Emptyclass) << endl;
    return 0;
}

运行结果:
空
故我们可知,空类的大小是1。(此处所说的是vs2013编译器下的结果,编译器不一样,空类大小不一样)

原因:这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址。
换句话说 C++编译器不允许对象为零长度。试想一个长度为0的对象在内存中怎么存放?怎么获取它的地址?为了避免这种情况,C++强制给这种类插入一个缺省成员,长度为1。如果有自定义的变量,变量将取代这个缺省成员。

猜你喜欢

转载自blog.csdn.net/tanrui519521/article/details/79969346
今日推荐