栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++基础知识

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++基础知识

C++基础知识
    • 1.命名空间
      • 1)作用
      • 2)定义
      • 3)命名空间中成员的使用
        • a.通过作用域限定符(::)指定成员
        • b.展开命名空间内的这个成员,将其暴露出来
        • c.展开命名空间,将命名空间内的所有成员都暴露出来
      • 4)命名空间的特点
    • 2.缺省参数
      • 1)全缺省和半缺省
      • 2)缺省参数使用注意事项
    • 3.输入输出
    • 4.auto关键字
      • 1)auto使用的细则
      • 2)auto不能推导的场景
    • 5.范围for
      • 1)使用说明
      • 2)使用条件
    • 6.指针空值nullptr
    • 7.引用
      • 1)引用的使用
      • 2)引用的特性
      • 3)引用作为函数的参数和返回值
      • 4)引用和指针的异同点

1.命名空间 1)作用

表示命名空间内的变量、方法和类是属于谁的,防止命名污染
编译器是很规矩的,如果两个变量名称相同,编译器就不知道该去调用哪一个,命名空间可以解决这个问题
也就是说如果有同名的变量、方法和类,只要它们属于不同的命名空间,使用的时候加上作用域限定符它们之间是不会相互影响的,编译器就能根据作用域限定符找到该变量、方法和类

2)定义

namesapce 命名空间名
{命名空间内的对象和方法}
示例:

//定义一个命名空间
namespace somebody
{
	char ch;
	int b;
	double c;
}
3)命名空间中成员的使用 a.通过作用域限定符(::)指定成员

命名空间名::成员名
示例:

somebody::ch = 'C';
b.展开命名空间内的这个成员,将其暴露出来

using 命名空间名::成员名;
示例:

using somebody::ch;
ch = 'a';
c.展开命名空间,将命名空间内的所有成员都暴露出来

(这种方式不推荐使用,因为这样命名空间的作用就没有发挥出来,还不如直接定义在外面)
using 命名空间名;

using somebody;
ch = 'a';
4)命名空间的特点

a.可以跨源文件;
不同源文件中的成员只要有相同的命名空间名,编译器就会将它们合并到同一个命名空间中

b.命名空间可以嵌套;
嵌套命名空间用法:
外部命名空间名::内部命名空间名::成员名

嵌套命名空间使用示例:

#include 

namespace Big 
{
        int a;
        namespace Small
        {   
                int b;    
        }   
}

using std::cout;
using std::endl;

int main()
{
        Big::a = 1;
        cout << Big::a << endl;
        
        
		
		//嵌套命名空间正确的用法
		Big::Small::b = 2;
		cout << Big::Small::b << endl;
        return 0;
}


2.缺省参数

缺省参数就是函数的默认参数,如果不指定就会使用这个默认值

1)全缺省和半缺省

全缺省:所有函数参数都有默认值
半缺省:函数参数只有部分有默认值,有默认值的参数从右往左连续

全缺省和半缺省示例:

//全缺省
void Fun(int a = 1, int b = 2)
{}

//错误的半缺省,从右往左不连续
void Fun2(int a = 1, int b, int c = 3)
{}
//错误的半缺省,从右往左不连续
void Fun2(int a = 1, int b = 2, int c)
{}

//正确的半缺省
void Fun2(int a, int b = 2, int c = 3)
{}
 
2)缺省参数使用注意事项

缺省参数不能在函数声明和定义中同时出现,这不是一个规定,但最好遵守这个原则

因为同时出现时,如果声明和定义中的值不相同不会发生问题,而声明和定义的缺省值不同,编译器就不知道该调用哪一个,会有二义性

验证(vs2013):

default.h:

#pragma once

#include 

using std::cout;
using std::endl;

void Fun(int a = 1, int b = 2);

default.cpp:

#include "default.h"

void Fun(int a = 10, int b = 24)
{
	cout << "void Fun(int a = 10, int b = 24);" << endl;
}

test.cpp:

#include "default.h"

int main()
{
	Fun();

	return 0;
}

程序运行报错:

在Linux使用g++验证没有报错,取决于编译器


3.输入输出

C++的输入输出必须包含头文件iostream,并且使用命名空间std;
cin:输入
cout:输出
C++的输入输出不需要进行格式控制


4.auto关键字

auto关键字可以进行自动类型推导,
对于名称比较复杂或者比较长的类型,我们可以给编译器一个值,让编译器在编译期间自己推导这个值的类型,这样就减少了操作;

auto it = 1;
1)auto使用的细则

a. 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&;
b. 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量;

2)auto不能推导的场景

a. auto不能作为函数的参数,因为函数参数在编译期间无法确定,编译器无法推导出变量的类型;

b. auto不能直接用来声明数组;
auto声明数组错误示例:


5.范围for

对于有范围的区间,不用指定范围就能对这个范围内的数据进行操作

1)使用说明

for(类型名 迭代变量 : 迭代区间)
for内的类型名常常使用auto自动推导

示例:

int arr[] = {1,2,3,4};
for(int e : arr)
{
	cout << e << " ";
}
cout << endl;
2)使用条件

for循环迭代的范围必须是确定的;
迭代的对象要实现++和==的操作;


6.指针空值nullptr

为什么C语言中已经有了指针空值NULL,C++还要引入nullptr?
因为C语言的NULL是一个宏,它有多个含义,可以表示字面常量0,也可以表示0的无类型指针,有时候在使用的时候会发生混乱,所以需要一个明确表示0的无类型指针的关键字nullptr;

注意对nullptr使用sizeof运算符时和对NULL使用sizeof运算符的结果是相同的


7.引用

引用是变量的别名,编译器不会为引用变量开辟空间,引用变量和它指向的变量同用一块内存空间

1)引用的使用

类型名& 变量名 = 指向的实体;

示例:

	int a = 1;
	int& ra = a;
2)引用的特性

引用在定义时必须初始化;
一个变量可以有多个引用;
引用一旦引用一个实体,再不能引用其他实体;

3)引用作为函数的参数和返回值

引用作为函数的参数和返回值时效率更高,因为传入或者返回的是一个变量的指向。

但是引用作为函数的参数或者返回值使用时,要根据场景进行选择,不是所有情况都适合使用引用,有些情况下传值反而更好

4)引用和指针的异同点

相同点:都是对于某个事物的指向;
不同点:
引用必须初始化,指针没有必须初始化的要求;
引用一旦指向一个实体,指向就不能发生改变,而指针的指向可以发生改变;
有多级指针,没有多级引用;
指针可以为空,引用不能为空;
在sizeof运算符中含义不同,引用表示它所指向的数据的大小,指针表示它自身的大小;
引用自加自减表示引用指向的实体+1或者-1,而指针自加自减表示指针向后或者向前偏移一个类型的大小;
访问实体方式不同,指针需要显示解引用,而引用编译器会自己处理;
引用比指针使用更加安全;

关于为什么引用比指针更安全,可参考下面的链接:
link

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/297536.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号