编程思想不同:
面向过程:是一种以过程为中心的编程思想。都是以什么正在发生为主要目标进行编程。C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
面向对象:是一类以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。C++语言是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数
代码如下:
typedef int STDateType;
struct Stack
{
void StackInit(int initSize = 4)
{
a = (STDateType*)malloc(sizeof(STDateType)*initSize);
size = 0;
capacity = initSize;
}
void StackPush(STDateType x)
{
a[size] = x;
size++;
}
STDateType* a;
int size;
int capacity;
};
上面结构体栈的定义,在C++中更喜欢用class来代替
类的两种定义方式:
第一种声明和定义都放在类体中:
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include
typedef int STDateType;
class Stack
{
public:
void StackInit(int initSize = 4)
{
a = (STDateType*)malloc(sizeof(STDateType)*initSize);
size = 0;
capacity = initSize;
}
void StackPush(STDateType x)
{
a[size] = x;
size++;
}
public:
STDateType* a;
int size;
int capacity;
};
typedef int STDateType;
class Stack
{
public:
//成员函数的声明
void StackInit(int initSize = 4);
void StackPush(STDateType x);
//成员变量的声明
STDateType* a;
int size;
int capacity;
};
//成员函数的定义
void Stack::StackInit(int initSize)
{
a = (STDateType*)malloc(sizeof(STDateType)*initSize);
size = 0;
capacity = initSize;
}
void Stack::StackPush(STDateType x)
{
a[size] = x;
size++;
}
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
【访问限定符说明】
【面试题】 面向对象的三大特性:封装、继承、多态。
在类和对象阶段,我们只研究类的封装特性,那什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符,指明成员属于哪个类域。
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include
typedef int STDateType;
class Stack
{
public:
void StackInit(int initSize = 4);
void StackPush(STDateType x);
private:
STDateType* a;
int size;
int capacity;
};
void Stack::StackInit(int initSize) //作用域符号::表示StackInit成员函数属于Stack域
{
a = (STDateType*)malloc(sizeof(STDateType)*initSize);
size = 0;
capacity = initSize;
}
void Stack::StackPush(STDateType x)//作用域符号::表示StackPush成员函数属于Stack域
{
a[size] = x;
size++;
}
用类类型创建对象的过程,称为类的实例化
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include
typedef int STDateType;
class Stack
{
public:
void StackInit(int initSize = 4);
void StackPush(STDateType x);
private:
STDateType* a;
int size;
int capacity;
};
class A1
{
};
class A2
{
void fun()
{
}
};
int main()
{
Stack st; //类的实例化,创建一个对象st
std::cout << sizeof(st) << std::endl;
std::cout << sizeof(A1) << std::endl;
std::cout << sizeof(A2) << std::endl;
return 0;
}
代码如下:
class Stack
{
public:
void StackInit(int initSize = 4);
void StackPush(STDateType x);
private:
STDateType* a;
int size;
int capacity;
};
class A1
{
};
class A2
{
void fun()
{
}
};
问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?
问题:对于上述两种存储方式,那计算机到底是按照那种方式来存储的?
我们再通过对下面的不同对象分别获取大小来分析看下:
结论:一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。
面试题
我们先来定义一个日期类Date:
代码如下:
class Date
{
public:
void InitDate(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
std::cout << _year << ":" << _month << ":" << _day << std::endl;
}
private:
int _year; //年
int _month; //月
int _day; //天
};
int main()
{
Date d1;
Date d2;
d1._year = 2021;
//d1._month = 5;
//d1._day = 27;
d1.InitDate(2021, 5, 27);
d2.InitDate(2021, 5, 28);
d1.Print();
d2.Print();
return 0;
}
我们不能通过实例化出来的对象d1或者d2直接去访问私有成员变量,而是通过公有成员函数取访问。
对于上述类,还有这样的一个问题:
Date类中有SetDate与Display两个成员函数,函数体中没有关于不同对象的区分,那当s1调用SetDate函数时,该函数是如何知道应该设置s1对象,而不是设置s2对象呢?
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
【面试题】
下面程序编译能通过吗?
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include
// 1.下面程序能编译通过吗?
// 2.下面程序会崩溃吗?在哪里崩溃
class A
{
public:
void PrintA()
{
std::cout << _a << std::endl;
}
void Show()
{
std::cout << "Show()" << std::endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->PrintA();
p->Show();
}
以上就是今天要讲的内容,本文仅仅简单介绍了类和对象(上)的使用,而类提供了大量能使我们快速便捷地处理数据的成员函数和成员变量,我们务必掌握。另外如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。