新的一年开始了,祝大家新年快乐,新的一年万事如意,代码运行无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;
};
二者没有强制要求,习惯就好。
好了,咱们这篇博客就聊到这个地方,下篇博客见~