C++初阶:C++基础知识

🚀前言:

本文主要讲述了,C++入门级的基础知识。1.命名空间;2.输入输出;3.缺省参数;4.函数重载;5.指针空之nullptr;6.引用&;7.auto;8.范围for;9.inline联合。

目录

🚢1.命名空间

🧡1.1.定义:

🧡1.2.使用:

🚢2.输入输出

💙2.1.说明:

💙2.2.用法:

🚢3.缺省参数

💚3.1.定义:

💚3.2.分类:

✨3.2.1.全缺省:

✨3.2.2.半缺省:

💚3.3.注意:

🚢4.函数重载

💜4.1.定义:

💜4.2.说明:

💜4.3.分类:

🎉4.3.1.参数个数不同:

🎉4.3.2.参数顺序不同:

🎉4.3.3.参数类型不同:

🚢5.指针空值nullptr(C++11)

💗5.1.NULL:

💗5.2.nullptr:

🚢6.引用&

💖6.1.定义:

💖6.2.特性:

💖6.3.优点:

💖6.4.用法:

🎃6.4.1.普通引用:

🎃6.4.2.常引用:

🎃6.4.3.作为参数:

🎃6.4.4.作为返回值:

💖6.5.与指针的关系:

🎀6.5.1.说明:

 🎀6.5.2.不同点:

🚢7.关键字:auto

💕7.1.定义:

💕7.2.注意:

🚢8.范围for

💓8.1.用法:

💓8.2.注意:

🚢9.inline内联

💝9.1.定义:

💝9.2.用法:

 💝9.3.注意:

🚢1.命名空间

🧡1.1.定义:

定义命名空间,需要使用到namespace关键字,后面跟命名空间名字(lmx) ,然后接一对 {        }即可,{        } 中即为命名空间的成员。

namespace lmx
{
	int a = 0;
	char b= 'a';
	int Add(int left, int right)
	{
		return left + right;
	}
}

🧡1.2.使用:

1.加命名空间名称及作用域限定符(单次)

int main()
{
    //cout << a << endl; 
    //a在lmx空间中要用::访问
    cout << lmx::a << endl;
}

2.使用using将命名空间中某个成员引入(单个)

using lmx::a;//后续用a则不需要再用::引用
int main()
{
	cout << a << endl;

	return 0;
}

3.使用using namespace 命名空间名称引入(全部)

using namespace lmx;//后续lmx中的全部不需要再用::引用
int main()
{
	cout << a << endl;
	int sum = Add(1, 2);
	cout << sum << endl;

	return 0;
}

🚢2.输入输出

💙2.1.说明:

1.cin标准输入对象(键盘),类似scanf,>>是流提取运算符。

2.cout标准输出对象(控制台),类似printf,<<是流插入操作符。

3.std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中。

4.必须包含< iostream >头文件 以及按命名空间使用方法使用std。

5.endl相当于'\n'。

💙2.2.用法

#include<iostream>
using namespace std;
int main()
{
	int a = 0;
	cout << "hello world !" << endl;
	cin >> a;

	return 0;
}

🚢3.缺省参数

💚3.1.定义:

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

💚3.2.分类:

✨3.2.1.全缺省:
int Add(int x = 0, int y = 0, int z = 0)
{
	return x + y + z;
}
int main()
{
	int sum1 = Add(1, 2, 3);
	cout << sum1 << endl;//6
	int sum2 = Add();
	cout << sum2 << endl;//0

	return 0;
}
✨3.2.2.半缺省:
int Add(int x, int y = 0, int z = 0)
{
	return x + y + z;
}
int main()
{
	int sum1 = Add(1, 2, 3);
	cout << sum1 << endl;//6
	int sum2 = Add(1);
	cout << sum2 << endl;//1

	return 0;
}

💚3.3.注意:

当有多个参数时,缺省参数不能在非缺省参数前面(报错),且C语言不支持缺省参数。

int Add(int x = 0, int y, int z)
{
	return x + y + z;
}
int main()
{
	int sum1 = Add(1, 2, 3);
	cout << sum1 << endl;
	int sum2 = Add(2,3);
	cout << sum2 << endl;

	return 0;
}

🚢4.函数重载

💜4.1.定义:

函数名相同,但参数个数/类型/顺序,作用类似的函数。

💜4.2.说明:

1.C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

2.参数相同,返回值不同,不能构成重载。

💜4.3.分类:

🎉4.3.1.参数个数不同:
void f()
{
 cout << "f()" << endl;
}
void f(int a)
{
 cout << "f(int a)" << endl;
}
🎉4.3.2.参数顺序不同:
void f(int a, char b)
{
 cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
 cout << "f(char b, int a)" << endl;
}
🎉4.3.3.参数类型不同:
void f(int a)
{
 cout << "f(int a)" << endl;
}
void f(char a)
{
 cout << "f(char a)" << endl;
}

🚢5.指针空值nullptr(C++11)

💗5.1.NULL

实际是一个宏,在传统的C头文件(stddef.h)中,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量.。

💗5.2.nullptr:

1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入 的。

2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同(字节都为4)。

3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

🚢6.引用&

💖6.1.定义:

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。    eg.孙悟空/齐天大圣/弼马温

💖6.2.特性:

                1. 引用在定义时必须初始化

                2. 一个变量可以有多个引用

                3. 引用一旦引用一个实体,再不能引用其他实体

💖6.3.优点:

        传引用和返回引用,大大提高效率。(不需要拷贝)

💖6.4.用法:

🎃6.4.1.普通引用:
int main()
{
	int a = 1;
	int& b = a;
	int& c = b;
	c = 2;
	cout << a <<" " << b << " " << c << endl;
    //2 2 2

	return 0;
}
🎃6.4.2.常引用:
void TestConstRef()
{
    const int a = 10;
    //int& ra = a;   // error,a为常量
    const int& ra = a;
    // int& b = 10; // error,b为常量
    const int& b = 10;
    double d = 12.34;
    //int& rd = d; // error,类型不同,需要生成临时变量(常性)
    const int& rd = d;
}
🎃6.4.3.作为参数:
//不用传指针即可修改值
void Swap(int& x, int& y)
{
	int tmp = 0;
	tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 5;
	int b = 0;
	Swap(a, b);
	cout << a << " " << b << endl;
    //0  5

	return 0;
}
🎃6.4.4.作为返回值:

        注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用                    引用返回,如果已经还给系统了,则必须使用传值返回。

int& Count()
{
	static int n = 0;
	n++;
	// ...
	return n;
}
int main()
{
	int ret = Count();
	cout << ret << endl;
	//可能返回1,也可能是随机值。
	return 0;
}

💖6.5.与指针的关系:

🎀6.5.1.说明:

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

int main()
{
	int a = 0;
	int& ra = a;
	int* const rra = &a;
	*(rra) = 10;
	cout << *(rra) << " " << ra << " " << a << endl;
    //10  10   10  三者等价
	return 0;
}
 🎀6.5.2.不同点:

1. 引用概念上定义一个变量的别名,指针存储一个变量地址

2. 引用在定义时必须初始化,指针没有要求

3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体

4. 没有NULL引用,但有NULL指针

5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节,64 位平台下占8个字节)

6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

7. 有多级指针,但是没有多级引用

8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

9. 引用比指针使用起来相对更安全

🚢7.关键字:auto

💕7.1.定义:

auto:会自动识别类型并匹配。

int TestAuto()
{
return 1;
}
int main()
{
int a = 1;
auto b = a;
auto c = 'a';
auto d = TestAuto();
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
//auto e; error,使用auto定义变量时必须对其进行初始化
return 0;
}

💕7.2.注意:

        1.使用时一定要对其初始化

        2.auto不能直接用来声明数组

🚢8.范围for

💓8.1.用法:

void TestFor()
{
    int array[] = { 1, 2, 3, 4, 5 };
    //for (auto e : array)  e只是拷贝,不影响array
    for (auto& e : array)   //影响array改变
        e *= 2;
    for (auto e : array)
        cout << e << " ";
}

💓8.2.注意:

//以下代码有问题,因为for的范围不确定
void TestFor( int array[])
{
    
   //for (auto& e : array)  
   //    e *= 2;
}

🚢9.inline内联

💝9.1.定义:

inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用。

缺陷:可能会使目标文件变大。

优势:少了调用开销,提高程序运行效率。(不会call)

适用:非递归,代码少,频繁调用。

💝9.2.用法:

inline int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int sum = Add(1, 2);
	cout << sum << endl;

	return 0;
}

 💝9.3.注意:

1.inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到。

2.内联是向编译器发送一个请求,编译器可以选择拒绝。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值