初始化
初始化:当一个对象被创建的同时获得了特定的值。
1.初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值代替;
2.默认初始化:如果定义变量时没有指定初值,则变量被默认初始化,也即编译器给定了一个默认值,该默认值由数据类型和定义的位置决定;
3.显式初始化:即定义变量时给定初始值;
4.绝大多数类都支持无须显式初始化而定义对象,这样的类提供了一个合适的默认值,但是对于内置类型需要格外注意定义的位置;
内置类型变量的初始化
当内置类型变量在定义时没有显式初始化,它的值由定义的位置决定:
1.定义在任何函数体外的内置类型变量被默认初始化为0;
2.定义在函数体内部的内置类型变量将不会被初始化,也即未进行定义,该对象的创建是失败的,如果引用该对象或者用指针指向该对象会引发错误;
3.建议显式初始化每一个内置类型的变量;
声明与定义
1.变量和函数都有声明与定义;
2.不管是函数还是变量,在使用前都必须进行声明;
3.声明告诉编译器变量或函数的类型+名字,不负责开辟存储空间,其存储地址需要编译器去寻找;
4.定义的同时也进行了声明,定义是在声明的基础上为变量或函数开辟了存储空间;
5.任何加上显示初始化式子的声明都是变量的定义,包括extern关键字,如
extern int a = 10;
此时extern的作用就消失了,它仍是个定义;
6.一个变量没有被初始化是未进行定义的;
7.C++中变量或函数可以声明多次,而定义通常只能进行一次,对于变量,如果存在多次定义会引发重定义的错误;对于函数,情况较复杂,其中重定义必须发生在不同作用域下。
extern关键字
在变量或函数前加extern关键字来告诉编译器我们该变量或函数的定义在别的文件中,在这里,我们只是声明一下。
class demo_1
{
public:
extern int a;
void test01()
{
}
};
上述代码中并没有对变量a进行定义,只是作出声明。
变量声明与定义
1.变量的声明需要指出变量的数据类型和变量名;
2.变量的定义需要指出变量的数据类型、变量名以及初始值,编译器会给变量开辟存储空间;
函数声明与定义
1.函数的声明需要指出数据类型和函数名,通常还加上函数的形参(为了可读性);
2.函数的定义需要指出数据类型、函数名、形参以及函数体;
3.函数的声明和定义很好分辨,仅通过有无花括号就可以分辨;
int test01(int a,double b);
int test02(int a,double b)
{
return 0;
}
4.由于C++编译器是从上到下执行代码的,因此处于main函数下面的函数在主函数的调用它前需要在主函数上方对该函数进行声明;
头文件的书写规范
在C++中,某个源文件包含头文件时,编译器会将头文件的内容拷贝到源文件中。前面提到的定义不能多次进行,如果头文件中包含某项定义,那么多次包含该头文件将会引发重定义的错误。因此在书写头文件需要进行适当处理,使其遇到多次包含时也能安全工作。
预处理器
1.确保头文件多次包含仍能安全工作的常用技术是预处理器,该功能继承于C语言。预处理器是在编译之前执行的一段程序,可以部分地改变我们所写的程序。
2.预处理变量无视C++语言中关于作用域的规则。
3.预处理器的功能包括:#include,头文件保护符。
#include
当预处理器看到#include标记时就会用指定的头文件的内容代替#include。
#include<iostream>
#include"ListNode.h"
头文件保护符
1.头文件保护符:#ifdef, #ifndef, #endif
2.头文件保护符依赖于预处理变量,预处理变量有两种状态:已定义和未定义。
3.#define指令把一个名字设定为预处理变量,另外两个指令则分别检查某个指定的预处理变量是否已经定义:#ifdef当且仅当变量已定义时为真,#ifndef当且仅当变量未定义时为真,一旦检查结果为真,则执行后续操作直至遇到#endif指令为止。
#ifndef LISTNODE_H
#define LISTNODE_H
...
#endif
以上是固定格式,#define不能放在#ifndef前头。
头文件书写的内容
由于头文件用于包含到多个不同的外文件中,因此头文件中通常写变量和函数的声明以及类或结构体的定义。
#ifndef LISTNODE_H
#define LISTNODE_H
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int val1, ListNode *next1 = nullptr)
{
val = val1;
next = next1;
}
};
class List
{
public:
ListNode *numberList;
List()
{
numberList = nullptr;
}
~List()
{
ListNode *n;
while (numberList != nullptr)
{
n = numberList;
numberList = numberList->next;
delete n;
}
cout << "congradgulations!" << endl;
}
ListNode *creat(int array[], int len)
{
for (int i = 0;i < len;i++)
{
numberList = new ListNode(array[i], numberList);
}
return numberList;
}
void print()
{
ListNode *nm = numberList;
while (nm != nullptr)
{
cout << nm->val << endl;
nm = nm->next;
}
cout << "hello" << endl;
}
};
class Solution {
public:
ListNode* removeElements(ListNode* head, int val)
{
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* cur = dummyHead;
while (cur->next != NULL) {
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else {
cur = cur->next;
}
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};
void creat(int array[], int len);
void print();
struct ListNode;
class List;
ListNode* removeElements(ListNode* head, int val);
#endif
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)