文章目录
一、C++输入和输出
C++的第⼀个程序
C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的hello world依旧可以运⾏
// test.cpp
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
C++中需要把定义⽂件代码后缀改为.cpp,vs编译器看到是.cpp后缀就会调⽤C++编译器编译,linux下要⽤g++编译,不再是gcc。
当然C++有⼀套⾃⼰的输⼊输出,严格说C++版本的hello world应该是这样写的。
#include<iostream>
using namespace std;
int main()
{
cout << "hello world\n" << endl;
return 0;
}
vs2022示范:
二、命名空间
namespace的价值
在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。
使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
C语言项目类似下⾯程序这样的命名冲突是普遍存在的问题C++引入namespace就是为了更好的解决这样的问题。
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
printf("%d\n", rand);
return 0;
}
vs2022示范:
会报错,由于在stdlib.h中已经有关于rand函数的定义了,所以会显示rand重定义。
为了避免这样的情况出现,我们可以创建一个域,这样就不会相互冲突了。
namespace的定义
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可。
namespace space
{
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
namespace本质是定义出⼀个域
这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。
C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个 变量 /函数 /类型出处 (声明或定义) 的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
当我们想在别处使用rand函数时,可以这样写:
int main()
{
// 全局的rand函数指针
printf("%p\n", rand);
// 指定count命名空间中的rand
printf("%d\n", bit::rand);
//或者是使用合并后的空间的函数
printf("%d\n",AND::OR);
return 0;
}
namespace只能定义在全局,当然他还可以嵌套定义。项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
namespace count
{
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
namespace add
{
int a = 10;
int b = 20;
double c = 3.1415;
}
//count 和 add 可以和在一起
namespace add
{
int a = 10;
int b = 20;
double c = 3.1415;
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
//嵌套命名空间
namespace AND
{
namespace OR
{
int rand = 1;
int Add(int left, int right)
{
return left + right;
}
}
namespace SIR
{
int rand = 2;
int Add(int left, int right)
{
return (left + right)*10;
}
}
}
int main()
{
printf("%d\n", AND::OR::rand);
printf("%d\n", AND::SIR::rand);
printf("%d\n", AND::OR::Add(1, 2));
printf("%d\n", AND::SIR::Add(1, 2));
return 0;
}
C++标准库都放在⼀个叫std(standard)的命名空间中,这也就是我们常看到的c++写法中的一幕:
using namespace std;
至于为什么是using namespace ,那就要到了接下来要讲到的命名空间的使用了。
命名空间使用
编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以下面程序会编译报错。
#include <stdlib.h>
#include<stdio.h>
namespace bit
{
int a = 0;
int b = 1;
}
int main()
{
printf("%d\n", a);
return 0;
}
所以我们要使用命名空间中定义的变量/函数,有三种方式:
1.指定命名空间访问,项⽬中推荐这种方式。
int main()
{
printf("%d\n", N::a);
return 0;
}
2.using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
using ADD::OR;
int main()
{
printf("%d\n", ADD::OR);
printf("%d\n", AIR);
return 0;
}
3.展开命名空间中全部成员,练习程序为了方便推荐使用。
using namespce N;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
三、C++输入&输出
是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输⼊、输出对象。
std::cin 是 istream
类的对象,它主要面向窄字(narrowcharacters (of type char))的标准输⼊流。
std::cout 是 ostream
类的对象,它主要面向窄字符的标准输出流。
std::endl 是⼀个函数,流插⼊输出时,相当于插入⼀个换行字符加刷新缓冲区。
<<
是流插⼊运算符, >>
是流提取运算符。
是的,在C语言中这两个运算符是用来作为左移和右移的
使⽤C++输⼊输出更⽅便,不需要像 printf / scanf 输⼊输出时那样,需要⼿动指定格式,C++的输⼊输出可以自动识别变量类型(本质是通过函数重载实现的)其实最重要的是C++的流能更好的⽀持⾃定义类型对象的输⼊输出。
#include<iostream>
int main()
{
int a = 0;
char b = 'c';
double c = 1.23423;
std::cout << a << " " << b << " " << " "<< c <<std:: endl;
return 0;
}
注意:在C++中,标准输出流 cout 和换行符操纵符 endl 默认定义在 std 命名空间中。如果代码文件的顶部没有使用 using namespace std; 语句,那么这行代码将无法编译通过,因为编译器不知道 cout 和 endl 的定义。
cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个std(standard)的命名空间中,所以要通过命名空间的使用方式去使用它们。
⼀般日常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。
#include<iostream>
using namespace std;
int main()
{
int a = 0;
double b, c;
cin >> a;
cin >> b >> c;
cout << a << endl;
cout << b << " " << c << endl;
return 0;
}
四、缺省参数
缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时,如果没有指定实参 ,则采用该形参的缺省值,否则使⽤指定的实参。
#include<iostream>
using namespace std;
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); // 没有传参时,使⽤参数的默认值
Func(10); // 传参时,使⽤指定的实参
return 0;
}
缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。
// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
// 半缺省
void Func2(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
int main()
{
Func1();
Func1(1);
Func1(1,2);
Func1(1,2,3);
Func2(100);
Func2(100, 200);
Func2(100, 200, 300);
return 0;
}
函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
标签:rand,return,入门,int,基础,namespace,c++,C++,printf From: https://blog.csdn.net/q38491/article/details/143817342