【C++篇】迈入新世界的大门——初识C++(上篇)
文章目录
前言
下篇已出:【C++篇】迈入新世界的大门——初识C++(下篇)
C++发展历史
C++起源
与C语言一样,C++也是在贝尔实验室诞生的,Bjarne Stroustrup于20世纪80年代在这里开发出了这种语言。Stroustrup比较关系的是让C++更有用,而不是实施特定的编程原理和风格。名称C++来自C语言的递增运算符++,名称C++表示它是C的扩充版本。
祖师爷
C++版本更新
C++23小故事
C++⼀直被诟病的⼀个地⽅就是⼀直没出⽹络库( networking ), networking之前是在C++23的计划中的,现在C++23已经发布了,但是没有networking,⽹上引发了⼀系列的吃⽠和吐槽。中间过程就像发⽣了宫⽃剧⼀样。
C++在工作领域的应用
C++的应⽤领域服务器端、游戏(引擎)、机器学习引擎、⾳视频处理、嵌⼊式软件、电信设备、⾦融 应⽤、基础库、操作系统、编译器、基础架构、基础⼯具、硬件交互等很多⽅⾯都有。
C++参考网站及文档书籍
编程语言排行榜
C++难度
C++是⼀个相对难学难精的语⾔,相⽐其他⼀些语⾔,学习难度要⾼⼀些要陡峭⼀些,这⾥有历史包袱的问题,也有语⾔本⾝设计和发展历史的问题。 ⽹上以前⼀直流传下⾯这个21天内⾃学精通C++的梗。当然⾃学难度很⼤,跟着⽐特课程⾛,相对会好⼀些。
参考文档书籍
参考文档
参考书籍
C++第一个程序
//test.cpp#include<stdio.h>int main(){printf("hello world!");
return 0;}
//test.cpp
#include<iostream>
using namespace std;
int main()
{
count<<"hello world\n"!<<endl;
return 0;
}
命名空间
为什么使用namespace
在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全 局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,于是祖师爷针对此问题在C/C++引入namespace
#include<stdio.h>
#include<stdlib.h>
int rand = 20;
int main()
{
//编译报错::"rand"重定义:以前定义的是"函数”
printf("%d\n", rand);
return 0;
}
因为标准库中有rand这个函数,在预处理阶段把头文件拷贝过来,在全局域就有两个rand,所以编译器认为rand"重定义"
namesapce定义及规则
namespace myTest
{
int rand = 20;
int add()
{
//......
}
}
namespace myTest
{
// 命名空间中可以定义变量/函数/类型
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
int main()
{
// 这⾥默认是访问的是全局的rand函数指针
printf("%p\n", rand);
// 这⾥指定myTest命名空间中的rand
printf("%d\n", myTest::rand);
return 0;
}
namespace bit
{
// xiaohua
namespace xiaohua
{
int rand = 1;
int Add(int left, int right)
{
return left + right;
}
}
// xiaopang
namespace xiaopang
{
int rand = 2;
int Add(int left, int right)
{
return (left + right) * 10;
}
}
}
int main()
{
printf("%d\n", bit::xiaohua::rand);
printf("%d\n", bit::xiaopang::rand);
printf("%d\n", bit::xiaohua::Add(1, 2));
printf("%d\n", bit::xiaopang::Add(1, 2));
return 0;
}
bu
#include<iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
命名空间使用
编译查找一个变量的声明/定义时,默认只会在局部或全局查找,不会到命名空间查找。所以我们要使用命名空间中定义的变量/函数,有三种方式:
不指定就会报错
#include<iostream>
namespace mytest
{
int a = 0;
int b = 0;
}
int main()
{
//error C2065: “a”: 未声明的标识符
printf("%d", a);
}
int main()
{
printf("%d",mytest:: a);
}
using mytest::a;
int main()
{
printf("%d", a);
}
namespace mytest
{
int a = 0;
int b = 0;
}
using namespace mytest;
int main()
{
printf("%d", a);
}
C++输入&输出
#include<iostream>
using namespace std;
int main()
{
int a = 20;
double d = 0.1;
char c = 'x';
cout << a << "" << d << "" << c;
scanf("%d%f", &a, &d);
printf("%d%f", a, d);
//可以自动识别变量类型
cin >> a;
cin >> d >> c;
cout << a << endl;
cout << d << c << endl;
return 0;
}
# include <iostream>using namespace std;int main (){// 在 io 需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下 3 ⾏代码// 可以提⾼ C++IO 效率ios_base:: sync_with_stdio ( false );cin. tie ( nullptr );cout. tie ( nullptr );return 0 ;}
IO流机类和对象,运算符重载、继承等很多面向对象的知识,这些知识我们还没讲解,所以这里我们只简单认识一下C++IO流的用法,后面会有专门的一个章节细节讲解IO流库。
缺省函数
• 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参 则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把 缺省参数也叫默认参数)
# include <iostream># include <assert.h>using namespace std;void Func ( int a = 0 ){cout << a << endl;}int main (){Func (); // 没有传参时,使⽤参数的默认值Func ( 10 ); // 传参时,使⽤指定的实参return 0 ;}
# include <iostream>using namespace std;// 全缺省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;}int main (){Func1 ();Func1 ( 1 );Func1 ( 1 , 2 );Func1 ( 1 , 2 , 3 );Func2 ( 100 );Func2 ( 100 , 200 );Func2 ( 100 , 200 , 300 );return 0 ;}
// Stack.hvoid STInit (ST* ps, int n = 4 );// 缺省参数不能声明和定义同时给void STInit (ST* ps, int n){assert (ps && n > 0 );ps->a = (STDataType*) malloc (n * sizeof (STDataType));ps->top = 0 ;ps->capacity = n;}
函数重载
// 1 、参数类型不同int Add ( int left, int right){cout << "int Add(int left, int right)" << endl;return left + right;}double Add ( double left, double right){cout << "double Add(double left, double right)" << endl;return left + right;}
参数个数不同:
// 2、参数个数不同
void f (){cout << "f()" << endl;}void f ( int a){cout << "f(int a)" << endl;}
返回值不同不能作为重载条件,因为调⽤时也⽆法区分//void fxx()//{}////int fxx()//{// return 0;//}
注意:
// 下⾯两个函数构成重载// f() 但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁void f1 (){cout << "f()" << endl;}void f1 ( int a = 10 ){cout << "f(int a)" << endl;}int main (){Add ( 10 , 20 );Add ( 10.1 , 20.2 );f ();f ( 10 );f ( 10 , 'a' );f ( 'a' , 10 );return 0 ;}
原文地址:https://blog.csdn.net/braveact/article/details/142580557
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!