飞道的博客

C++基础:从C过渡到C++,需要注意这几点

282人阅读  评论(0)


C++ 又名 C plus plus ,是C语言的超集,C++可以完全引用C

C : 面向过程——解决问题
C++ :面向对象——找谁解决

用C++编译下显示helloworld

编写文件 helloworld.cpp

#include <iostream>

// using namespace std; 表示后面用到的都是来自标准库

int main(){
   
        //std 表示来自标准库
        std::cout << "Hello World" << std::endl;    // printf("Hello World\n");
}

编译使用 g++ helloworld.cpp
./a.out 运行

结果为:

Hello World

头文件 #include <iostream> 如同C语言中的 #include <stdio.h>
namespace 是命名空间,std 表示后面的命令使用的是标准库中的命令

1. 引用头文件

C++头文件使用C标准库,在C标准库文件名前加上字母c,并且省略后缀名.h

C头文件 C++头文件
#include <stdio.h> #include <iosteam> / #include <cstdio>
#include <stdlib.h> #include <cstdlib>
#include <string.h> #include <cstring>
#include <math.h> #include <cmath>

2. 函数重载

C语言中,函数不能命名为标准库中的命令,但C++编译是可以的

函数重载: 函数名相同但其他参数(个数或者类型)不相同,c++判断这两个函数不同

#include <cstdio>
void printf(){
   
    printf("Hello world");
}
int main(){
   
    printf();
}

此程序在C++中是支持的!

3. 命名空间

命名空间: 让相同函数名的函数也能编译,避免全局变量、函数类的命名冲突
类似于文件夹,函数名字相同也不会冲突

#include <cstdio>

using namespace std;

//定义命名空间和命名空间下的函数
namespace English{
   
        void printf(){
   
                std::printf("Hello World");
        }
}

namespace Chinese{
   
        void printf(){
   
                std::printf("你好世界");
        }
}

using namespace Chinese;
int main(){
   
        printf();
        English::printf();
}

结果为:

你好世界Hello World

using namespace Chinese; 下面将广泛使用命名空间
English::printf(); 指定使用命名空间

在 C++ 中,不带 .h 后缀的头文件所包含和定义的标识符在 std 空间中;
带 .h 后缀的头文件所包含和定义的标识符在全局命名空间中,不需要声明使用 std 空间

4. 输入输出的区别

cin 从终端里读
cout 写入终端中

#include <iostream>
#include <cstdio>

using namespace std;

int main(){
   
        int n;
        float f;
        char s[20];
        /*
        scanf("%d%f%s",&n,&f,&s);
        printf("%d\n%f\n%s\n",n,f,s);
        */
        cin >> n >> f >> s;
        cout << n << endl << f << endl << s << endl;
        //c++输入输出不用写类型,它自己知道类型
}

结果为:

10 1.1 abc
10
1.1
abc

c++输入输出不用写类型,它自己知道类型

5. 动态内存

在 C++ 中申请内存使用的是 new
销毁内存使用的是 delete

我们用C和C++的方式分别申请和释放单个内存和整个数组

#include <cstdio>    // printf() 用到
#include <cstdlib>   // malloc() free() 用到
#include <iostream>  // cout 用到

using namespace std;

int main(){
   

        //申请一个内存
        int* p = (int*)malloc(sizeof(int));
        *p = 100;
        printf("%p %d\n",p,*p);
        free(p);
        p = NULL;

        //c++ 申请内存方式
        int* q = new int;
        *q = 200;
        cout << q << " " << *q << endl;
        delete q;
        q = NULL;

        //申请多个内存
        int* parr = (int*)malloc(sizeof(int)*5);
        for(int i=0;i<5;++i){
   
                parr[i] = i;
        }
        for(int i=0;i<5;++i){
   
                printf("%p %d\n",parr+i,parr[i]);
        }
        free(parr);
        parr = NULL;

        //c++ 申请内存方式
        int* qarr = new int[5];
        for(int i=0;i<5;++i){
   
                qarr[i] = i;
        }
        for(int i=0;i<5;++i){
   
                cout << qarr+i << " " << qarr[i] << endl;
        }
        delete [] qarr;    // []表示释放的是数组
        qarr = NULL;
}

在 C++ 中用 malloc 是不能判别类型的,需要强制 int* p = (int*)malloc(sizeof(int));

结果为:

0x69feb0 100
0x69feb0 200
0x69feb0 0
0x69feb4 1
0x69feb8 2
0x69febc 3
0x69fec0 4
0x69feb0 0
0x69feb4 1
0x69feb8 2
0x69febc 3
0x69fec0 4

如结果所示,刚释放掉的内存可能被下一个定义的指针申请

C++ 仍然可以使用 malloc() / free() ,但是不建议这么做

6. 初始化

在C++中,括号就能进行变量初始化

#include <iostream>

using namespace std;

int main(){
   
        int n = 10;     // c初始化内置类型
        int m(20);      // c++初始化变量
        int t{
   30};      // c++11统一初始化方式
        cout << n << " " << m << " " << t << endl;
}

结果为:

10 20 30

转载:https://blog.csdn.net/weixin_39398433/article/details/116599550
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场