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、函数返回局部变量


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


目录
相关文章
|
3月前
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
39 0
|
2月前
|
安全 C语言 C++
C++学习笔记
C++学习笔记
|
3月前
|
C++
c++学习笔记02 运算符
C++学习笔记,介绍了C++中的运算符,包括基本的加减乘除、求模、前后置递增递减、赋值运算符、比较运算符和逻辑运算符的使用及其注意事项。
38 6
|
3月前
|
C++
c++学习笔记01 基本知识与数据类型
C++学习笔记,涵盖了C++中的常量定义、数据类型、变量内存大小计算、基本数据类型(整型、实型、字符型、字符串型、布尔型)以及转义字符的使用。
46 4
|
3月前
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
42 4
|
3月前
|
C++
【学习笔记】【C/C++】 c++字面值常量
【学习笔记】【C/C++】 c++字面值常量
35 1
|
3月前
|
存储 C++
c++学习笔记05 函数
C++函数使用的详细学习笔记05,包括函数的基本格式、值传递、函数声明、以及如何在不同文件中组织函数代码的示例和技巧。
34 0
c++学习笔记05 函数
|
3月前
|
编译器 C++
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
44 0
|
3月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
40 0
|
3月前
|
C++
c++学习笔记09 引用
C++引用的详细学习笔记,解释了引用的概念、语法、使用注意事项以及引用与变量的关系。
43 0