C to C++ 基础语法

Connor

Why C++

经过大一一整年的学习,相信各位的C语言都有了扎实的基础——。
但是咱们课程不讲C++,但是咱的算法题很多用C++会变得更方便,所以还得会。
于是笨人最近在学习C++,故写进博客。


先来看一段简单的代码

1
2
3
4
5
6
7
8
9
10
#include<iostream>

using namespace std;

int main(){
    int n;
    cin >> n;
    cout << "Hello World " << n << endl;
    return 0;
}

嗯,很显然这是一个输入n,然后输出Hello World再输出n的程序

我们先来看第1行
#include<iostream>
其实就是跟C语言一样导入库,只不过导入的不是<stdio.h>库了,<iostream>可以认为是一个输入输出流的库。

接下来再康第三行

1
using namespace std;

的意思是 使用 命名空间 std。

这地方要说可能要说挺多。结论是:现在做算法题和小程序建议加上这一句,解释不想看的可以快进(嗯嗯。

下面是解释

命名空间?

命名空间是什么

在C++中,命名空间(namespace)是一种用来防止名字冲突的机制。
如:

1
int count = 10;

如果写了很多个库,每个库里都有一个count变量,那编译器就不知道该用哪个了。

于是为了解决这种问题,C++把不同库里的名字放进不同的命名空间里。

1
2
3
4
5
6
namespace A{
int count = 10;
}
namespace B{
int count = 10;
}

通过这样,就可以在使用时,区分两个count,如

1
2
A::count += 1;
B::count += 2;

就把两个命名空间里的count区分开了。

std命名空间

C++ 标准库里的所有东西(比如 cout, cin, string, vector 等等)
都被放进了一个叫 std(standard) 的命名空间里。

所以严格写法是

1
2
3
4
5
6
7
8
#include<iostream>

int main(){
    int n;
    std::cin >> n;
    std::cout <<"Hello World " << n << std::endl;
    return 0;
}

这里的std:: 表示从命名空间std里找cin,cout,endl

using namespace std;的作用

这条语句的意思是:从现在开始,使用命名空间std里的所有名字时,不需要加前缀std::
起到了一个省略的作用
于是就变成了最上面的那个代码的样子

有时不建议使用它

using namespace std的写法,在小程序里非常方便。
但如果在大型项目和库开发中,就可能引发命名冲突。

如自己写了一个

1
void sort(){/* ... */}

但标准库里也有一个std::sort()
所以,如果用了using namespace std;,编译器就可能混淆这两个函数。

所以最安全的做法就是不用这个语句,干脆把所有的std::前缀都加上。


cin, cout

就是C++的输入和输出函数,在一定条件下可以代替scanf,printf函数(不过效率赶不上)。
使用cin的时候就不用加取地址符&

注意两个函数使用时的箭头方向>> <<
若有多个输入和输出的元素,可以用多个箭头链接,如

1
2
cin >> a >> b >> c;
cout << a << ' ' << b << ' ' << c << endl

endl

end of line的简写,用来代替换行。
当然也可以用\n替代

bool

再来看一个简单的代码

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using namespace std;

int main(){
bool flag1 = true;
bool flag2 = -1;
bool flag3 = 0;

cout << flag1 << ' ' << flag2 << ' ' << flag3 << endl;
return 0;
}

输出的结果为
1 1 0
bool只有两个取值,trueflase
任何非0的值,都会被转成true,只有0会被转成flase。

提示:bool虽然只有0和1两个值,可以用二进制的1位表示,但是bool变量实际是占1个字节(8位)。
为什么?

因为:
计算机的最小可寻址单位是字节(byte)。
CPU 不能直接寻址“半个字节”或“1 bit”的内存单元,
所以即使只有一个布尔值,也得分配整整 1 个字节。

string类

字符串的定义

1
2
3
string s1 = "hello";
string s2 = "world";
string s3;

so easy~

字符串的更改

和C语言一样,可以通过使用

1
s[0] = 'H';

这种方式更改

字符串的拼接

1
s3 = s1 + s2;

直接用’+’就可以链接字符串了,so easy~。

字符串的输入

这里可以用C语言类比一下。
使用

1
cin >> s

就可以把输入字符串了,其中cin会在读取到空格、回车时停止,和scanf相同。
那当然还有输入一行的了~

1
getline(cin, s);

这里的cin是指从标准输入流(键盘)中读入字符串,存到字符串s里。

字符串的输出

1
cout << s;

so easy~

字符串的长度

所求字符串s的长度,这个跟C语言有些不同
使用

1
int len = s.length();

即可把字符串s的长度存到len
为什么要这么写而不是像strlen(s)一样,把字符串放到函数里呢?

让我们回看这一节的标题,字符串类,没错他是一个类。那么学过java的都知道了,类是有属性和方法的,这里的length()就是一个方法,返回这个字符串的长度。

字符串的复制

可以直接用 = 来赋值,如

1
2
s1 = 'hello world';
s2 = s1;

字符串其他常用函数

s.empty()
判断s是否为空,空返回1,否则返回0。

s.front()
返回s第一个字符

s.back()
返回s最后一个字符

s += t / s.append(t)
拼接字符串

s.push_back(c)
添加单个字符到末尾

s.pop_back()
删除末尾字符

s.clear()
清空字符串

s.find(t)
在字符串s里找字符串t首次出现位置

s.substr(pos, len)
获取s中pos处,长度为len的字符串

s.substr(pos)
如果只输入一个值的话,就是获取从pos处到字符串s末尾的子串

s.compare(t)
把s和t比较,等同于strcmp(s, t)等同于

s1 == s2
判断两个字符串是否相等,若相等返回true,否则false。

不常用但有时会用的函数

s.insert(pos, t)
在指定位置插入字符串

s.erase(pos, len)
删除子串

s.replace(pos, len, t)
替换子串

s.swap(t)
交换两个字符串

结构体

C++的结构体使用和C有些不同

看这个例子

1
2
3
4
struct stu{
string name;
int age;
};

比如我们要生成一个stu的数组,在C中我们需要写

1
struct stu a[10];

而在C++中,我们只需要写

1
stu a[10];

看出不同来了吧~,也就是说在这里我们不需要使用typedef了~

&的使用

看下面这个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;

void plus1(int &a){
a += 1;
}

int main(){
int a = 2;

plus1(a);

cout << a << endl;

return 0;
}

通过这种方法,可以直接实现a += 1,即输出3

int &a 表示 引用,也就是,别名
当你传入 a 时,函数内部的 a ,实际上就是 main 中的 a
对它的修改会直接影响原变量

也就是直接把形参变成了实参~。


C++的基础语法就到这里啦~
下期来学STL~。

  • Title: C to C++ 基础语法
  • Author: Connor
  • Created at : 2025-10-14 13:13:28
  • Updated at : 2025-10-22 16:25:31
  • Link: https://redefine.ohevan.com/2025/10/14/CtoC++1/
  • License: This work is licensed under CC BY-NC-SA 4.0.