C++入门收尾(nullptr)|类与对象引入


新的一年开始了,祝大家新年快乐,新的一年万事如意,代码运行无bug~

1、C++指针空值nullptr

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化(将其指向空指针NULL):

void TestPtr()
{
int* p1 = NULL;
int* p2 = 0;
// ……
}

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

由此可见,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

void f(int)
{
 cout<<"f(int)"<<endl;
}
void f(int*)
{
 cout<<"f(int*)"<<endl;
}
int main()
{
 f(0);
 f(NULL);
 f((int*)NULL);
 return 0;
}

在这里插入图片描述
我们可以看到这里的运行结果,当我们没有对NULL进行强转成指针的时候,NULL被定义成0,但程序本意是想通过f(NULL)调用指针版本的f(int*)函数,因此与程序的初衷相悖。

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void )。
所以C++中用nullptr来代替NULL。
注意
1.在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
2.在C++11中,sizeof(nullptr) 与 sizeof((void
)0)所占的字节数相同。
3.为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

2、面向过程和面向对象初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题
C语言面向过程我们可以理解为洗衣服的步骤 :
在这里插入图片描述
在这里插入图片描述
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成
在这里插入图片描述
所以C++就是首要关注不同对象之间的关系。

3、类的引入及其定义

在C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数。所以我认为完全可以说类就是C++在结构体的基础上对结构体的升级产品。

a.类的定义

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

class为定义类的关键字ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。(要注意与结构体之间的区别)
类体中内容称为类的成员:类中的变量称为类的属性成员变量; 类中的函数称为类的方法或者成员函数

b.类的两种定义方法

1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理
在这里插入图片描述
2.类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
在这里插入图片描述
由于第一种方法编译器可能会将成员函数当作内联函数处理,所以我们通常采用第二种方法。

3.成员变量命名规则的建议

在这里插入图片描述
我看到上面图片这串代码时,心里有了一个疑问:这里的year到底是成员变量,还是函数形参?
其实解决方法也很简单:
我们可以在成员变量的前面或后面加上一个"_"

class Date
{
public:
 void Init(int year)
 {
 _year = year;
 }
private:
 int _year;
};

或者也可以这样:

class Date
{
public:
 void Init(int year)
 {
 mYear = year;
 }
private:
 int mYear;
};

二者没有强制要求,习惯就好。

好了,咱们这篇博客就聊到这个地方,下篇博客见~

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值