前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++入门基础(上篇)

C++入门基础(上篇)

作者头像
用户11286421
发布2024-09-23 20:04:41
980
发布2024-09-23 20:04:41
举报
文章被收录于专栏:学习

c++的历史:

C++的起源可以追溯到1979年,当时BjarneStroustrup(本贾尼·斯特劳斯特卢普,这个翻译的名字不 同的地⽅可能有差异)在⻉尔实验室从事计算机科学和软件⼯程的研究⼯作。⾯对项⽬中复杂的软件开 发任务,特别是模拟和操作系统的开发⼯作,他感受到了现有语⾔(如C语⾔)在表达能⼒、可维护性 和可扩展性⽅⾯的不⾜。 1983年,BjarneStroustrup在C语⾔的基础上添加了⾯向对象编程的特性,设计出了C++语⾔的雏形, 此时的C++已经有了类、封装、继承等核⼼概念,为后来的⾯向对象编程奠定了基础。这⼀年该语⾔被 正式命名为C++。

c++的重要性

TIOBE发布的编程语言排行榜

 足以看到c++的重要性,并且c++可以从事许多领域的工作如:

⼤型系统软件开发。如编译器、数据库、操作系统、浏览器等等  游戏引擎开发。很多游戏引擎就都是使⽤C++开发的,游戏开发要掌握C++基础和数据结构,学习图形学知识,掌握游戏引擎和框架,了解引擎实现,引擎源代码可以学习UE4、

Cocos2d-x等开源引擎实现。嵌⼊式开发。嵌⼊式把具有计算能⼒的主控板嵌⼊到机器装置或者电⼦装置的内部,通过软件能够 控制这些装置。⽐如:智能⼿环、摄像头、扫地机器⼈、智能⾳响、⻔禁系统、⻋载系统等等,粗 略⼀点,嵌⼊式开发主要分为嵌⼊式应⽤和嵌⼊式驱动开发等等

c++的第一个程序

C语言中的第一次打印

代码语言:javascript
复制
 // test.cpp
 #include<stdio.h>
 int main()
 {
 printf("hello world\n");
 return 0;
 }

在C++的后缀.cpp中一样可以使用C语言的语法 

c++中的第一次打印 

代码语言:javascript
复制
// test.cpp
//这⾥的std cout等我们都看不懂,没关系,下⾯我们会依次讲解
#include<iostream>;
using namespace std;
int main()
{
	cout << "hello world" << endl;
	return 0;
}

C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的helloworld依旧可以运⾏,C++中需要把定义⽂件 代码后缀改为.cpp,vs编译器看到是.cpp就会调⽤C++编译器编译

命名空间

namespace的价值

在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的(优化C语言中语法)。

c语⾔项⽬类似下⾯程序这样的命名冲突是普遍存在的问题,C++引⼊namespace就是为了更好的解决这样的问题

代码语言:javascript
复制
#include <stdio.h>                                                             
#include <stdio.h>
#include <stdlib.h>//这个库函数当中有rand函数
#int rand = 10;
int main()
{
    // 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数” 
    printf("%d\n", rand);
    return 0;
}

namespace的定义

• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。

• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。

• namespace只能定义在全局,当然他还可以嵌套定义。

• 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。

• C++标准库都放在⼀个叫std(standard)的命名空间中。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
// 1. 正常的命名空间定义
// LHF是命名空间的名字,⼀般开发中是⽤项⽬名字做命名空间名。
namespace LHF
{
 // 命名空间中可以定义变量/函数/类型
     int rand = 10;
}
int main()
{
    // 这⾥默认是访问的是全局的rand函数指针 
    printf("%p\n", rand); 
    printf("%d\n", LHF::rand);// 这⾥指定LHF命名空间中的rand 
    return 0;
}

并且命名空间可以嵌套

代码语言:javascript
复制
//命名空间可以嵌套
 
namespace LHF
{
//猪
    namespace pig;
    {
         int rand = 1;
         int Add(int left, int right)
        {
             return left + right;
        }
    }    
//鸭子
    namespace duck
    {
         int rand = 2;
         int Add(int left, int right)
        {
             return (left + right)*10;
        }
    }
}
int main()
{
     printf("%d\n", LHF::pig::rand);
     printf("%d\n", LHF::duck::rand);
     printf("%d\n", LHF::pig::Add(1, 2));
     printf("%d\n", LHF::duck::Add(1, 2));
     return 0;
}

多文件中可以定义同名 namespace ,他们会默认合并到⼀起,就像同⼀个 namespace ⼀样 

命名空间的使用 

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:

• 指定命名空间访问,项⽬中推荐这种⽅式。 • using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。 • 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤

代码语言:javascript
复制
#include<stdio.h>
namespace LHF
{
    int a = 0;
    int b = 1;
}

//using将命名空间中某个成员展开
//比如:using LHF::b;//输出b时不需要再加上LHF::
//展开命名空间中全部成员
//比如:using namespce N;//输出LHF中的所有成员就不需要再继续展开
//下面是两种情况
//错误形式
int main()
{
    // 编译报错:error C2065: “a”: 未声明的标识符
    printf("%d\n", a);
    return 0;
}

//正确形式
int main()
{
    printf("%d\n",LHF::a);
    return 0;
}

c++的输入和输出

• 是Input Output Stream的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输 出对象。 • std::cin 是istream类的对象,它主要⾯向窄字符(narrowcharacters(oftypechar))的标准输 ⼊流。 • std::cout 是ostream类的对象,它主要⾯向窄字符的标准输出流。 • std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。 • >是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移) • 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊ 输出可以⾃动识别变量类型(本质是通过函数重载实现的),其实最重要的是 C++的流能更好的⽀持⾃定义类型对象的输⼊输出。 • IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识,这些知识我们还没有讲解,所以这 ⾥我们只能简单认识⼀下C++IO流的⽤法,后⾯我们会有专⻔的⼀个章节来细节IO流库。 • cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使⽤⽅式去⽤他们。 • ⼀般⽇常练习中我们可以usingnamespacestd,实际项⽬开发中不建议usingnamespacestd。 • 这⾥我们没有包含,也可以使⽤printf和scanf,在包含间接包含了。vs系列编译器是这样的,其他编译器可能会报错。

代码语言:javascript
复制
#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;
}

 缺省参数

• 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把缺省参数也叫默认参数) • 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。 • 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。 • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。

函数重载 

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。

代码语言:javascript
复制
#include<iostream>
 using namespace std;
 // 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;
}
// 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;
}


//返回值不同不能作为重载条件,因为调⽤时也⽆法区分
//void fxx() 
//int fxx()
// f()
//下⾯两个函数构成重载
// f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁
 
void f1()
{
     cout << "f()" << endl;
}
void f1(int a = 10)
{
    cout << "f(int a)" << endl;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • c++的历史:
    • c++的重要性
    • c++的第一个程序
    • 命名空间
      • namespace的价值
        • namespace的定义
        • 命名空间的使用 
        • c++的输入和输出
        •  缺省参数
        • 函数重载 
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档