一,C++经典短句Hello World
C++兼容C语言绝大多数语法,所以C语言实现的经典短句依旧可以运行,但C味太浓,当然C++有自己的一套输入输出,记得源文件后缀是.cpp
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello World"<<endl;
return 0;
}
二,命名空间
1. namespace关键字用于解决命名冲突的问题
1.namespace关键字,后面跟命名空间的名字,接一对{},{}中即为命名空间的成员。命名空间中可定义变量/函数/类型等。
2.namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以不会有同名变量冲突
3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,命名冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期。 命名空间域和类域不影响生命周期。
4.namespace只能定义在全局,main函数外,当然也可以嵌套定义
5.多文件中可以定义同名namespace,他们会默认合并到一起,像同一个namespace一样
namespace cyk //后跟自定义命名空间的名字
{
int a = 11;
int b = 21;
int ADD(int right, int left)
{
return right + left;
}
namespace kk
{
int b = 5; //命名空间可以嵌套
}
}
int a = 7;//全局变量
int main()
{
cout << "hello world!!!" << endl; //可以把cout看作控制台,把内容推到控制台中<<,endl表示
换行,当然"\n"也可
cout << cyk::a << endl;
cout << cyk::b << "\n";
cout << ::a << endl;//访问全局变量
//::域作用限定符,若其左边啥都不写,就是默认访问全局变量
cout << cyk::ADD(11, 21) << endl; //命名空间中可定义函数
cout << cyk::kk::b << endl; //命名空间可嵌套使用
//以上全是指定命名空间访问
using cyk::b;//使用using将命名空间中某个成员展开
cout << b << endl;
using namespace cyk;//展开命名空间中全部成员
cout << b << endl;
}
2.命名空间的使用:
*编译查找一个变量的声明/定义时,默认只会在局部/全局查找,不会到命名空间里去查找。所以要使用命名空间中的变量/函数,有三种方式:
1.指定命名空间访问,项目中推荐这种方式
2.使用using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式
3.展开命名空间中全部成员项目不推荐风险较大日常练习小程序为了方便推荐使用
三,C++输入&输出
1.<iostream>是Input Output Stream的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象
2.std::是istream类的对象,它主要面向窄字符(narrow characters(of type char))的标准输入流
3.std::cout是ostream类的对象,主要面向窄字符的标准输出流
4.std::endl是一个函数,流插入输出时,相当于一个换行字符刷新缓冲区
5.<<是流插入运算符,>>是流提取运算符(C语言还用这两个运算符做位运算左移/右移)
6.使用C++输入输出更方便,可以 自动识别 变量类型(本质通过函数重载实现的,后面再讲),不用像C一样,用scanf/printf手动指定格式。总之,C++的流能更好的支持自定义类型对象的输入输出
7.IO流涉及类和对象、运算符重载、继承等很多面向对象的知识,先简单认识一下,后面再说
8.cout/cin/endl等都属于C++标准库,C++标准库都放在一个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们 using namespace std
9.一般日常练习可用using namespace std,实际开发项目中不建议使用
10.这里没有出现<stdio.h>,也可以用printf和scanf,因为在包含<iostream>间接包含了。VS是这样的,其他编译器可能会报错
int d = 12;
double e = 14.0;
char f = 'c';
printf("C输入输出整数,浮点数\n");
scanf_s("%d%lf", &d, &e);
printf("%d %lf\n", d, e);
//可以自动识别类型
cout << "C++输入输出整数,浮点数,字符" << endl;
cin >> d >> e >> f;
cout << d << " " << e << " " << f << endl; //输出空格直接“”中间敲空格
****在IO需求比较高的地方,如部分大量输入的竞赛题中,加以下代码,可提高C++IO效率
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
四,缺省参数
1.缺省参数是声明或定义函数时为函数的参数指定的一个缺省值。调用该函数时,如没有传实参,则采用该形参的缺省值即初始化的值,否则使用指定的实参。分为全缺省和半缺省函数(有些地方把缺省函数叫做默认函数)
2.全缺省——全部形参给缺省值(都用默认值),半缺省——部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能跳跃给值
3.带缺省函数的调用,C++规定必须 从左到右 依次给实参,不能跳跃给实参
4.在函数的定义和声明分离时,缺省函数不能在函数声明和定义中同时出现,规定必须在函数 声明 时给缺省值
void func(int b = 1)
{
cout << b << endl;
}
//全缺省
void func1(int b = 1, int c = 2, int d = 3)
{
cout << "b = " << " " << b << endl;
cout << "c = " << " " << c << endl;
cout << "d = " << " " << d << endl;
}
//半缺省
void func2(int b, int c = 100, int d = 200)
{
cout << "b = " << " " << b << endl;
cout << "c = " << " " << c << endl;
cout << "d = " << " " << d << endl;
}
int main()
{
func();//没有传参时,使用参数初始化的默认值
func(22);//传参时,使用指定的实参
func1();
func1(10,20,30);
func2(1121);//半缺省,最少传未初始化的b的值
func2(11,21,12);//做人就要做实参,不要当缺省参数
//void SLTnit(ST * ps, int n = 4); 如头文件中对函数进行声明,必须在声明时给出初始值,不确定
开多大空间就用缺省函数
}
五,函数重载
C++支持在同一作用域中出现同名函数,但要求这些同名函数的形参不同,可以是参数个数不同或类型不同,这样C++函数调用就表现出了多态行为。C语言是不支持同一作用域中出现同名函数的
// 1.参数类型不同
int ADD(int left, int right)
{
cout << "ADD(int left, int right)" << endl;
return left + right;
}
double ADD(double left, double right)
{
cout << "ADD(double left, double right)" << endl;
return left + right;
}
// 2.参数个数不同
void f()
{
cout << "f()" << endl; //无参
}
void f(int a)
{
cout << "f(int a)" << endl; //有参
}
// 3.参数类型顺序不同
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.注意:返回值不能作为重载的条件,因为调用时无法区分
int main()
{
ADD(11, 21);
ADD(11.21, 12.14);
f();
f(7);
f(11, 'c');
f('z', 7);
return 0;
}
以上即为C++入门基础,更多干货持续更新中…