我们经常说到,C语言与C++最大的区别就在于:
C语言是面向过程的,关注的是解决问题的过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
而C++是基于面向对象的,关注的是对象,将一件事情拆分成为不同的对象,靠对象之间的交互完成。
首先我们先来回忆C语言中的结构体
#include <stdio.h>
#include <stdlib.h>
struct A1
{
int a;
double b;
};
struct A2
{
};
struct A3
{
int a;
double b;
char c;
void printA()
{
printf("%d\n", a);//成员函数中可以直接使用自己的成员变量
}
void printB();
};
void A3::printB()
{
printf("%.2lf\n", b);
}
int main()
{
printf("%d %d %d\n", sizeof(A1), sizeof(A2), sizeof(A3));
A3 test;
printf("%p %p %p %p\n", &test.a, &test.b, &test.c, &test);
test.a = 5;
test.printA();
test.b = 3.14;
test.printB();
system("pause");
return 0;
}
其实在C语言当中,结构体中只能定义变量,但是在C++当中,结构体中不仅可以定义变量,也可以定义函数
比如下面这个例子:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
using namespace std;
struct Student
{
char m_name[20];
char m_gender[3];
int m_age;
void setInfo(const char * name, const char * gender, int age)
{
strcpy(m_name, name);
strcpy(m_gender, gender);
m_age = age;
}
void printStudentInfo()
{
cout << m_name << ' ' << m_gender << ' ' << m_age;
}
};
int main()
{
Student s;
s.setInfo("Jack", "男", 18);
s.printStudentInfo();
system("pause");
return 0;
}
关于类的定义:
class classname
{
};
而在C++中更喜欢用class来代替
class为定义类的关键字,classname为类的名字,{}中为类的主体,这里要注意类定义结束时后面的分号。
类中的元素称为类的成员:
类中的元素称为类的成员
类中的数据称为类的属性或者成员变量
类中的函数称为类的方法或者成员函数
关于类的访问限定符及封装
访问限定符
C++实现封装的方式:用类将对象的属性和方法结合在一块,让对象更加完善,通过访问权限选择性的将接口提供给外部的用户使用。
访问限定符的分类:
public 公有
protected 保护
private 私有
访问限定符的说明:
public修饰的成员在类外可以被访问
protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
class的默认访问权限为private,而struct为public(因为struct要兼容C)
注意:访问限定符只在编译的时候有用,当数据映射到内存后,没有任何访问权限符上的区别。
封装
封装就是将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互。
封装的本质上是一种管理,比如某一个景区,如果什么都不管,景区肯定会被破坏,现在我们通过“建设房子将景区封装起来”,外边的人看不到也进不去,接着我们开通了售票通道,通过买票突破封装并且在合理地监管机制下进去参观。
类其实也是一样的,对类的数据和方法进行封装,让外边的人无法看到(使用protected或者private),只开放一些共有的成员函数对成员合理地访问。
总结
结构体在C和C++中的不同
- 在C++中,用结构体定义变量不需要加struct
- 在C++中,可以定义空结构体,大小为1,而C中不行
- 在C++中,可以再结构体中声明甚至实现函数,而C中只能放函数指针
- 在C++中,成员函数可以直接访问本结构体的变量而无需传入,在C中,函数和结构体并无直接关联。
成员函数不会影响结构体的大小,因为成员函数是放在公共区域的,只是在这个结构体域中而已。
写在类内部的成员函数默认为内联函数,复杂函数写在类外边。
类
类是一类特殊的结构体,在上述结构体中加入 public: ,把 struct 改成 class 就成了一个简单的类.
访问限定符:
public: 正常访问
private: 只能在类内部访问
protected: 目前跟private没有区别
tip1: 访问限定符只在编译阶段生效,编译好后,在运行阶段并没有限定.
tip2: 结构体其实也能使用访问限定符,只是一般不去使用,因为它是用来兼容C结构体的
tip3: 结构体中默认是public,而类中默认是private.