C++入门【c++】

这篇文章我们来学习吹泡泡,有一次性几点学习内容:

目录

零、本节知识安排目的

一、c++关键字

二、命名空间

 2.1命名空间的定义

2.2命名空间的使用

2.2注意事项

三、c++输入与输出

四、缺省参数

4.1缺省参数概念

4.2缺省参数分类

五、函数重载

5.1函数重载概念

5.2函数重载的几个类别

5.2 c++支持函数重载的原理——名字修饰


零、本节知识安排目的

在学习c++前我们为什么要学习c语言,因为c++就是由几个大佬对c语言进行升级改进得来的,c++的根就是c,c++包容c的语法不过也有许多独创的语法,在c语言的基础上容纳了面对对象编程思想。并增加了许多有用的库,以及编程范式等。

本章主要目的:

1、补充c语言语法的不足

2、为后续类的学习打下基础

一、c++关键字

c++有63个关键字,c语言有32个关键字

二、命名空间

在c/c++中,变量和后面学到的类都是大量存在的,这些函数、变量和类的名称都大量存在用途全局作用域中,可能会导致很多冲突,就是同一个名字被使用多次。使用命名空间的目的是对标识符名称进行初始化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

总而言之,命名空间就是为了避免命名冲突。

命名冲突:

 stdlib.h里面有一个rand函数,你编写的这个程序编译器就分不清你想要的是rand=10这个变量还是rand函数的返回值。

所以c++提出了namespace来解决这个问题。

 2.1命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟美国这命名空间的名字,然后接一对{}即可,{}中间即为命名空间成员。

使用方法:

namespace bit
{
    int rand=10;
    int ADD(int left,int right)
    {
        return left+right;
    }
    struct Node
    {
        struct Node*next;
        int val;
    };
}
int main()
{
    int a = 10, b = 10;
	printf("%d", bit::ADD(a,b));//域作用限定符
	return 0;
}

2.2命名空间的使用

(1)加命名空间以及作用域限定符:

int main()
{
    priuntf("%d",N::a);
    return 0;
}

(2)使用using建某个命名空间某个变量引入:

using N::b;
int mian()
{
    printf("%d",b);
    return 0;
}

(3)使用using namespace 命名空间:

using namespace N;
int main()
{
    printf("%d",b);
    return 0;
}

 我们用到的using namespace std的语法依据就是源自于此,为了避免coder定义的变量和函数与库函数冲突,改良c的大佬就把所有库函数封装在命名空间std里面,然后我们每次使用using namespace std ;就相当于回到了没有把他们封装起来的状态,容易命名冲突的问题又暴露出来了,只不过我们平时做函数练习不太会命名冲突才这样。

2.2注意事项

(1) 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

比如在一个.h文件里有一个命名空间:

namespace N
{
    int a;
}

然后在另外一个.h文件里有一个同名的命名空间:

namespace n
{
    int b;
}

然后编译器会整合成一个

namespace N
{
    int a;
    int b;
}

(2)在同一个层次上的域是不能重定义的,但是可以在另一个层次的域是可以出现重定义的

不允许:

namespace n
{
    int a;
}

namespace m
{
    char a;
}

但是允许:

namespace n
{
    int a;
    namespace m
    {
        char a;
    }
}
//使用的时候:
n::m::a='c';

三、c++输入与输出

c++的hello world:

#include<iostream>
using namespace std;
int main()
{
    cout<<"Hello world!"<<endl;
    return 0;
}

说明:

1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含<iostream>头文件以及按命名空间使用方法使用std。

2.cout和cin是全局的流对象,endl是特殊c++符号,表示换行输出,他们都包含在<iostream>头文件中。

3.<<是流插入运算符,>>流提取运算符。

4.使用c++输入更加方便因为他不需要用到像printf/scanf输入输出那样,需要手动控制格式,c++的输入输出是可以自动识别类型的。

注意:早期标准库将所有功能在全局域中实现,声明在 .h 后缀的头文件中,使用时只需包含对应
头文件即可,后来将其实现在 std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,
规定 C++ 头文件不带 .h ;旧编译器 (vc 6.0) 中还支持 <iostream.h> 格式,后续编译器已不支持,因
推荐 使用 <iostream>+std 的方式。

#include<iostream>
using namespace std;
int main()
{
    int a=1;
    char b=98;
    double c=1.1;
    cout<<a <<" "<<b<<" " <<c<<endl;
    return 0;
}

 虽然c++的输入输出非常轻松,但我们并不是只能用c++的输入输出就比如说,我们只想输出小数点后两位,这时候我们用c++的语法就没有怎么容易的虽然可以但是会麻烦一些,遇到这种情况建议c++语法夹杂着c的语法.

#include<iostream>
using namespace std;
int main()
{
    int a=1;
    char b=98;
    double c=1.11111;
    cout<<a <<" "<<b<<" ";
    printf("%0.2f\n",c);
    return 0;
}

四、缺省参数

4.1缺省参数概念

缺省参数是声明或定义函数时为函数指定的一个缺省值。在调用该函数时,如果没有指定实参则采用该形式的缺省值,否则使用指定的实参。

void Func(int a = 0) {
 cout<<a<<endl; }
int main()
{
 Func();     // 没有传参时,使用参数的默认值
 Func(10);   // 传参时,使用指定的实参
return 0; 
}

4.2缺省参数分类

(1)全缺省参数

void Func(int a = 10, int b = 20, int c = 30)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

(2)半缺省参数

void Func(int a,int b=10,int c=20)
{
    cout <<"a= "<<a<<endl;
    cout <<"b= "<<b<<endl;
    cout <<"c= "<<c<<endl;
}

注意:

1.半缺省参数必须从右往左依次来给出,不能间隔着给。

int main()
{
    Func(10,,30);
}

2.缺省参数不能在函数声明和定义中同时出现,因为要是声明的缺省,和定义的缺省不一致,那我们调用的时候要用哪种?我们一般在函数声明的时候进行缺省时定义,在函数定义的时候不进行缺省。

void Func(int a=10,int b,int c=20);
void Func(int a,int b,int c=20)
{
    cout <<"a= "<<a<<endl;
    cout <<"b= "<<b<<endl;
    cout <<"c= "<<c<<endl;
}

3.缺省值必须是常亮或者全局变量。

4.c语言不支持。(编译器不支持)

五、函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重
载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个
是男足。前者是 谁也赢不了! ,后者是 谁也赢不了!

5.1函数重载概念

是函数的一种特殊情况,c++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、或类型或类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

5.2函数重载的几个类别

#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; 
 }
int main()
{
 Add(10, 20);
 Add(10.1, 20.2);
 f();
 f(10);
 f(10, 'a');
 f('a', 10);
 return 0; 
}

注意第三点,是参数顺序类型不同,而不是强调顺序不同(int a,int b)变成(int b,int a)就不行。

5.2 c++支持函数重载的原理——名字修饰

为什么c不支持函数重载但是c++支持呢?

简单的说就是:程序在编译链接时需要找到函数的地址去进行调用的,而我们在C语言找到函数的地址是通过函数的名字,比如你定义一个函数void fun(int a);就是通过fun这个名字找到的。

但要是在c++语法中是需要在查找前对名字进行重修饰的,以void fun(int a,double b)为例,就会通过funid这个和名字去查找地址,fun为函数原名,i和d是他的形参数据类型int和double。这样编译器调用时就不会找到 fun(int a)那里去了。

猜你喜欢

转载自blog.csdn.net/qq_64484137/article/details/126896761