c++学习笔记之基础篇

简介: 这个系列整理了一下学习c++的知识点,本篇简单提及一些基础的东西,涉及到一些具体的知识后面的篇章会细说。

1、基本类型取值范围



在c++中, int、long、double、short、float等的取值范围不是固定的,是与系统有关的,与Java不同。


2、引用参数:


在参数类型后面加&即可,如:

int &count

引用参数与原参数指向同一地址,是原参数的别名而已。与传值参数的区别:

int m = n;

int &m = n;


第一条是值参数,将n的值赋予m,m和n没有关系。


第二条是引用参数,将n的引用赋予m,m只是n的别名,当n或m值改变时另外一个也会跟着改变


3、防止“==”和“=”混淆


在c++中,如果“==”和“=”使用错误(如该使用“==”的地方使用了“=”),由于c++和Java不同,很多时候并不报错。比如在if判断语句中

if(n = 1)


并不会报错(在Java中就会报错),因为c++中任何非零值都当成true。

为了防止混淆,在“==”语句中一般将变量放在右边,如:

7==n


这样的话当写错成“7=n”的时候编辑器就会报错。


4、默认实参


默认实参:函数的某个参数不经常使用,可以给函数形参一个默认值,在调用该函数时可以忽略这个参数。


默认实参必须是函数参数列表最靠右边的参数。当调用具有多个默认实参的函数时,如果省略的实参不是形参列表中最靠右的参数,那么该实参右边的所有参数也必须被省略。如:

函数原型

int volume(int length = 1, int width = 1, int height = 1);

调用

volume()

volume(10)

volume(10, 8)

volume(10, 8, 2)

都是可以的。


5、一元作用域和二元作用域


作用域运算符(::)

当局部变量和全局变量有相同名字时,用一元作用域分辨运算符来区分。

在局部变量的作用域中,直接使用变量则使用的是局部变量,而加上(::)来使用变量则使用的是全局变量,如:


int number = 10;
void get(){
     int number = 1;
     number = 2;         //这时是给局部变量number赋值
     ::number = 3;       //这时是给全局变量number赋值
}
复制代码


当局部变量和类作用域变量有相同名字时,用二元作用域分辨运算符来区分。

与上面类似,加上(类型::)来使用变量是类作用域变量。

注意区分类作用域变量和全局变量,全局变量不在类内部。


6、重载与默认参数


当函数有默认参数时,重载时要格外注意,防止出现二义性。如:

函数原型

int volume(int length = 1, int width = 1, int height = 1);

重载函数

int volume(int length, int width)

这样的话当调用volume(2, 3)时编译器就不知道选择哪个函数。


7、函数模板


所谓函数模板实际上是建立一个通用函数,其涵涵素类型额形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。

凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。


类似java中的泛型。

定义函数模板的一般形式为:template 或者template

例如:


template<typename T>
T n_add(T a,T b){}
复制代码


可以替代:


int n_add(int a,int b)
double n_add(double a,double b)
复制代码


等函数,不必重复定义这么多函数了。


8、求值顺序


c++中没有指定大多数运算符其操作数的求值顺序。只明确指定了“&&”、“||”、“,”、“?:”这四种运算符的操作数的求值顺序。

所以不能直接认为操作数的顺序是从左向右的,不同的编译器可能顺序不同。

如:


int c;
int a(){
     return c + 2;
}
int b(){
     return c++;
}
a() + b();
复制代码


不能直接认为a()一定在b()前运算,所以在 做改变了操作数中自身值得运算一定要格外小心。


9、常量的声明和赋值


使用const限定符声明一个常量变量,常量变量必须在声明时用一个常量表达式来初始化,而且之后不能修改。

声明常量是没有赋值,是一个编译错误。

在可执行语句中给常量变量赋值也是一个编译错误。


10、setfill


填充指定字符,是粘性的。所以一条语句中setfill后面的都会进行填充。

注意:因为是粘性的,所以setfill之后如果不再需要填充一定要恢复。


11、拷贝构造函数


必须以引用的形式接收参数,而非值,否则会无穷递归。

因为如果是值的形式,在调用拷贝构造函数时,会传一份拷贝,这样又调用了拷贝函数,产生了无限递归。


12、虚悬指针


如果两个对象都指向同一内存,一个对象回收时析构函数会删除这块内存的分配。另外一个对象就变成了虚悬指针,会引起运行错误。


13、函数返回局部变量


返回局部变量引用或指针是常见的错误,因为局部变量在函数完成就回收了。


目录
相关文章
|
2天前
|
C++
【C++】学习笔记——继承_2
【C++】学习笔记——继承_2
9 1
|
17小时前
|
存储 算法 编译器
程序与技术分享:C++模板元编程学习笔记
程序与技术分享:C++模板元编程学习笔记
|
2天前
|
存储 C++ 容器
【C++】学习笔记——map和set
【C++】学习笔记——map和set
7 0
|
2天前
|
C++
【C++】学习笔记——二叉搜索树
【C++】学习笔记——二叉搜索树
6 0
|
2天前
|
编译器 C++
【C++】学习笔记——多态_2
【C++】学习笔记——多态_2
5 0
|
2天前
|
编译器 C++
【C++】学习笔记——多态_1
【C++】学习笔记——多态_1
5 0
|
2天前
|
程序员 编译器 C++
【C++】学习笔记——继承_1
【C++】学习笔记——继承_1
5 0
|
2天前
|
编译器 C++
【C++】学习笔记——模板进阶
【C++】学习笔记——模板进阶
5 0
|
2天前
|
C++ 容器
【C++】学习笔记——优先级队列
【C++】学习笔记——优先级队列
5 0
|
2天前
|
C++ 容器
【C++】学习笔记——stack和queue
【C++】学习笔记——stack和queue
5 0