零、C++基本语法

命名空间

功能:

解决符号名称冲突的方法

语法:

namespace <命名空间名称>
{
	//代码
}

使用:

局部引用:

	 **&lt;命名空间名字&gt; :: &lt;函数名/变量名/类名&gt;**

全部引用:

	引用整个命名空间的内容:	

		**using namespace &lt;命名空间的名字&gt;;**      

	引用命名空间内单个元素符号:	

		**using &lt;命名空间的名字&gt; :: &lt;命名空间内元素符号&gt;**
::
域操作符,用于访问作用域
#include <iostream>

using namespace std;

namespace mySpace
{
	int a = 10;
}

int main()
{
	int a = 20;
	cout << "a = " << a << endl; //20
	cout << "mySpace::a = " << mySpace::a << endl; //10
	return 0;
}

命名空间取别名:

一个命名空间可以取多个别名,使用别名和原名无任何区别
namespace mySpace
{
	int a;
}

namespace mySpace2 = mySpce;

匿名命名空间:

定义自己的命名空间时不需要取名字,可以直接使用里面的函数或者变量,但只在当前文件内生效

#include <iostream>

namespace mySpace
{
	int a = 10;
}
namespace
{
	int a = 50;
}

int main()
{
	cout << "a = " << a << endl; //50
	cout << "mySpace::a = " << mySpace::a << endl; //10
	return 0;
}

using:

功能一:

	using namespace 将一个命名空间中的所有名词导入到当前作用域中,从而可以直接使用该命名空间中的所有名称吗,而不必使用作用域解析运算符(::)
#include <iostream>

namespace mySpace
{
	int a = 10;
}

int main()
{
	using namespace mySpace;
	cout << "a = " << a << endl; //10
	return 0;
}

功能二:

	**定义别名**

**using INT = int**   <==> tyepdef int INT;

C++输入输出

C++中输入输出通过的方式来实现

流运算符:
 **&lt;&lt;**  输出运算符

 **&gt;&gt;**  输入运算符
定义:
//cin = control-in

cin  标准输入对象:

	输入类型不匹配会返回空

	消除了scanf连续输入多次字符时产生垃圾字符的缺点

//cout = control-out

cout 标准输出对象

	设置域宽:cout.width(5),设置域宽为5

	cout输出顺序从左往右,运算顺序从右往左(右边的先算,最后打印)

endl 换行操作
设置域宽:
cout.width(5),设置域宽为5
标准设置:
oct 八进制

hex 十六进制

dec 十进制

showbase 显示前缀
使用cin和cout注意点:
需要包含iostreanm头文件

引用标准命名空间std
#include <iostream>

using namespace std;


int main(int argc, const char *argv[])
{
    int a = 0, b = 0;

    cin >> a >> b;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    //cout.width(5);
    cout << showbase;
    cout << oct;
    cout << "a = " << a << endl;

    cout << hex;
    cout << "a = " << a << endl;
  
    cout << dec;
    cout << "a = " << a << endl;
	return 0;
}

cout的执行顺序和输出顺序

cout执行顺序:从右往左执行

cout输出顺序:从左往右执行

C++函数

带默认值的函数

定义:

C++中存在带默认值的函数,即使不传参也会按默认值参数运行

规则:

1、需要添加默认值的参数直接在参数栏中用等号赋值即可

2、可以所有参数都存在默认值,也可以部分参数设为默认值

3、**只有部分参数有默认值时,带默认值的参数必须放在参数栏末尾**

4、实参和形参的传参是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提

5、**默认参数只需要在声明或定义时说明,不需要两者都说明**

带占位参数的函数

定义:

C++中的函数的参数列表可以有占位参数,用来占位,调用函数时必须填补该位置

规则:

只写类型不写变量名

若无默认值参数,则调用时必须填补

若有默认值参数,则调用时可以不用填补
#include <iostream>

using namespace std;

//show_fun_1是带默认值的参数
//参数c的默认值是100
void show_fun_1(int a, int b, int c = 100);

void show_fun_1(int a, int b, int c)
{
    cout << a << endl << b << endl 
        << c << endl;
}

//show_fun_2是带占位符的函数
//如果没默认值,需要传递第三个参数
//有默认值,不需要传递第三个参数
void show_fun_2(int a, int b, int)
{
    cout << a << endl << b << endl;
}

int main(int argc, char const *argv[])
{
    int data1 = 10, data2 = 20;
    show_fun_1(data1, data2);
    show_fun_2(data1, data2, 300);

    return 0;
}

函数的重载

定义:

在同一作用域内,参数列表不同,函数名相同的函数。

虽然函数名相同,但函数所在内存位置不同,本质上还是不同函数

规则:

1、函数名称必须相同

2、参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)

3、函数的返回类型可以相同也可以不相同

4、仅仅返回类型不同不足以成为函数的重载的依据

原理:

在编译阶段函数会被重新命名,根据函数名、参数列表来决定,比如void Swap(int &a, int &b)在编译阶段的名称为_Swap_int_int

注意事项:

避免与带有默认值的函数进行重载

C++引用

左值:可以取地址的值

右值:不可以取地址的值

int a = 10;
a  ---> 左值
&a ---> 右值

左值的引用

定义:(取别名)

引用变量是一个别名,也就是说,它是某个已存变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量

引用和指针的区别:

1、不存在空引用。引用必须连接到一块合法的内存

2、一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象

3、引用必须在创建时被初始化。指针可以在任何时间被初始化

规则:

<类型>&<引用名> = 目标名

引用必须在创建时被初始化,且初始化后不可以指向其他目标名(**const**)

引用类型必须与目标类型一致

不能将已有的引用名作为其他变量或对象的名字或别名

原理:

使用引用时编译器会在底层生产一个指针,并进行*运算

本质时指针常量的使用**int *const p**
const int * const p = &a;
顶层const --> p
底层const --> *p

用法:

函数传参:

函数返回值:返回的数据不可为局部变量
#include <iostream>

using namespace std;

int &Swap(int &a, int &b)
{
    static int sum = a + b;
    int temp = a;
    a = b;
    b = temp;

    return sum;
}

int main(int argc, const char *argv[])
{
    int a, b;

    cin >> a >> b;
    Swap(a, b);
    cout << "a : " << a << endl
        << "b : " << b << endl;

    int &ret = Swap(a, b);
    cout << "ret : " << ret << endl;

	return 0;
}

对数组引用:
int arr[5] = {1, 2, 3, 4, 5};
int (&refArr)[5] = arr;
refArr[0] = 6;
cout << "arr[0] : " << arr[0] << endl;
对指针引用:
int num = 100;
int *ptr = &num;
int *&refPtr = ptr;

*refPtr = 200;
cout << "num : " << num << endl;

右值引用

定义:

右值引用必须立即进行初始化操作,且只能使用右值进行初始化,当其被初始化过后,在当前作用域内被定义为左值

int a = 3;
int &&b = 3;
b = 100;

函数的重载

定义:

在同一个作用域内,参数列表不用,函数名相同的函数

虽然函数名相同,但函数所在内存位置不同,本质上还是不同函数

规则:

1、函数名必须相同

2、参数列表必须不同(个数不同,类型不同,参数排队不同等)

3、函数的返回类型可以相同也可以不相同

4、仅仅返回类型不同不足以成为函数的重载的依据

原理:

//反编译
g++ -S xx.cpp
在xx.s文件中找 .type

注意点:

避免与带有默认值的函数进行重载

nullptr :替代NULL,能够隐式转换成任何指针或成员指针的类型,也能和他们进行相等或者不等的比较 ---> c++11新特性

NULL存在问题:

 (void *)0  &lt;==&gt; NULL
万能引用既可以接收左值由可以接收右值
左值引用只能接收左值,如果要接收右值必须使用常量左值引用
右值引用只能接收右值

new和delete

是操作符,不需要()

new:申请一个对象

delete:销毁一个对象

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    int *pa = new int(100);
    int *parray = new int [5]{1, 2, 3, 4, 5};
    cout << *pa << endl;
    int *pb = new int (200);
    cout << *pb << endl;
    cout << *pb << endl;
    cout << parray[1] << endl;

    delete pb;
    delete pa;
    pa = NULL;
    pb = NULL;
    delete parray;

    return 0;
}

new delete 和 malloc free区别

1、new/delete的实现是基于malloc/free

2、malloc/free是C/C++标准库函数,new/delete是C++操作符

3、malloc/free需要手动计算类型大小,且返回void*,new/delete可以自己计算类型大小,根据类型返回相应的类型的指针

4、malloc/free只负责分配/释放空间,new/delete会调用构造函数与析构函数,用于初始化对象与销毁对象

5、它们都是动态管理内存的入口,堆是一块具体区域内存,而自由存量区是一个抽象概念

列表初始化(c11新特性)

功能:
主要用于统一初始化语法

初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,以一个新值替代

顶层const和底层const

顶层const:表示指针本身是一个常量

底层const:表示指针所指的对象是一个常量

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值