C语言转C++的必备知识(基本篇)

所有的知识全都会通过代码例子的形式讲解,而有C语言基础转C++比较好理解。

一、引例

1.第一个简单的例子:

#include <iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;            //类似于C语言的scanf,就是输入,等价于scanf("%d",&n);
	cout << "hello C++" << n++ << endl;

	system("pause");
	return 0;
}

①   上面代码中的using namespace std是什么意思?

        意为使用std这个名称空间,因为不同厂商定义的函数彼此可能重复,避免重复就会把函数放在名称空间里。使用时在main前说明使用的名称空间,其中,cin、cout、endl都在std名称空间里。

  std:: 前缀是C++中标准命名空间(namespace)的标识符。在C++中,std 是一个命名空间,它包含标准库的所有组件。使用 std:: 前缀可以帮助区分标准库中的同名元素和程序员自己定义的元素,从而避免命名冲突。

        因为标准库(Standard Library)中的所有内容都被定义在名为 std 的命名空间中。这意味着,当你想要使用标准库中的任何类、函数、对象等时,你需要通过 std:: 前缀来指定你想要使用的是标准库中的那个特定实体。

        例如,如果想要使用标准库中的 cout 来输出文本到控制台,需要这样写:

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

        这里,std::cout 指的是标准库中的 cout 对象,而 std::endl 是一个用于插入换行符并刷新输出缓冲区的操纵符(manipulator)。

        然而,如果你在你的程序中使用了 using namespace std; 语句,那么你就可以省略 std:: 前缀,直接写 cout 和 endl,如下所示:

#include <iostream> 
using namespace std; 

int main() 
{ 
cout << "Hello, world!" << endl; 
return 0; 
}

②cin>>n:其中的>>就是指把输入的数值“赋值”给n。

    cout<<"str"<<n++<<endl:<<就是把字符串赋给cout并输出,endl就是end of line,就是/n(换行符)

执行程序:

注意:因为n++“先用后加”,所以输出的就是输入的值,若想输出+1的值,则需要改为++n,因为++n是“先加后用”,即先把n+1后更新n的值为所用。 

  • 若把using namespace std去掉发现报错:“未定义标识符”,也就是cin、cout、endl等标识符没有被定义。这时若还想用std中的cin,就要改为std::cin。其他标识符同理。
  • cin、cout他俩的运行速度比不上scanf和printf。
  • 在原来的C语言知识中,添加头文件如下:
#include<string.h>
#include<math.h>

但是在C++中,只需在前面加c即可:

#include<cstring>
#include<cmath>

二、变量

1.变量声明:C++中的变量声明比较简单,主要体现在for循环中可以直接定义

for (int i=0;i<10;i++)
    cout<<n<<" ";
cout << endl;

复现:

 2.bool变量:C++特有,原本在C语言中我们只用0和1表示false和true,现在C++引入了bool,非零值为true,零值为false。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main()
{
	bool flag = true;
	bool flag1 = -1;
	bool flag2 = 0;

	cout << flag <<" " << flag1 << " " << flag2 << " " << endl;
	return 0;
}

结果(非零的都是true,即1): 

三、const定义常量

eg:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main(void)
{
	const int MAX = 110;
	cout << MAX<< endl;
	return 0;
}

与C语言中的#define有点相似。(#define MAX = 110;)C语言中个别教材提到const指定所指向的存储单元其内容无法变化。我们这里也是一样,定义一个无法改变的常量,若后续改变改值会报错。

四、string类

1.定义:用于表示和处理字符串的一个重要部分。它提供了一系列成员函数和方法,使得字符串操作变得更加安全和便捷。如,string S = “str1”;。

2.拼接: 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main(void)
{
	string s1 = "hello";
	string s2 = "C++";
	string s = s1 + s2;

	cout << s << endl;
	return 0;
}

结果:helloC++

3.输入输出:

	cin >> s;
	cout << s << endl;

 cin只能将输入中的一个单词输出,另一个在缓冲区中,如下。解决方法:getline

 注意:在VS2022中头文件要加入<string>,否则会报错未定义的标识符。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
using namespace std;
int main(void)
{
	getline(cin, s);
	cout << s << endl;
	return 0;
}

 4.输出字符串长度:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
using namespace std;
int main(void)
{
	string s;
	getline(cin, s);
	cout << s << endl;
	cout << s.length() << endl;    //输出字符串长度s.length()
	return 0;
}

 5.子串的处理:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
using namespace std;
int main(void)
{
	string s = "hello world!";
	cout << s << endl;
	string s_sub = "s.substr(1,2)";
	cout << s_sub<< endl;
	return 0;
}

其中,s_sub=s.substr(n,m),代表从第n个字符后(即第n+1个字符)开始取,一共取m个字符。若不输入m,则代表把第n个后面所有的字符都拷贝到字串。

拓展

1.点运算符(使用对象调用)

点运算符用于访问对象的数据成员或成员函数。当一个对象已经被创建,并且它的引用或值可以直接被使用时,你可以使用点运算符来调用成员函数或访问数据成员。

eg:

假设我们有一个类 Person,它有一个成员函数 sayHello()

class Person {
public:
    void sayHello() {
        std::cout << "Hello!" << std::endl;
    }
};

int main() {
    Person p; // 创建一个Person对象
    p.sayHello(); // 使用点运算符调用sayHello()函数
    return 0;
}

在这个例子中,p.sayHello() 就是使用点运算符来调用 Person 类的 sayHello 成员函数。 

2.箭头运算符(指针)

箭头运算符用于通过指针访问对象的成员。当你有一个指向对象的指针时,你需要使用箭头运算符来访问该对象的数据成员或成员函数。

eg:

如果我们要通过指针来调用 PersonsayHello 函数:

#include <iostream>

class Person {
public:
    void sayHello() {
        std::cout << "Hello!" << std::endl;
    }
};

int main() {
    Person* p = new Person(); // 分配内存并创建Person对象
    p->sayHello(); // 使用箭头运算符调用sayHello()函数
    delete p; // 释放分配的内存
    return 0;
}

在这个例子中,p->sayHello(); 表示通过指针 p 来调用 sayHello 函数。

注意:

  • 如果你试图访问的对象是一个未初始化的指针或空指针,使用箭头运算符会导致运行时错误(通常是段错误)。
  • 如果你试图通过点运算符访问一个非成员函数,编译器会产生一个错误,因为它期望找到一个成员函数或数据成员。

总结:

点运算符和箭头运算符是C++中用于访问类成员(包括成员函数)的两种主要方式。选择哪种方式取决于你是在直接使用对象还是通过指针访问对象。正确使用这些运算符是C++编程的基础之一。

 五、结构体

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
using namespace std;

struct stu {
	string name;
	int age;
};

int main(void)
{
	struct stu a[10];	//在C语言中我们经常这么写
	stu a[10];          //在C++中可以进行简化

	return 0;
}

    在C语言中,typedef 关键字主要用于给已存在的数据类型起一个别名,这有助于提高代码的可读性和编写效率。而在C++中,类和结构体本身就提供了类型封装的能力。你可以定义类或结构体来包含数据和操作这些数据的方法,这比单纯使用 typedef 提供了更多的面向对象编程特性。

 六、引用&和传值

形式:int &a 和int a(这里的&不同于C语言中的)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
using namespace std;

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

int main(void)
{
	int a = 4;
	c(a);
	cout << a << endl;

	return 0;
}

输出结果:5(去掉&就是4)

1.引用(传引用)(int &a

引用是C++中一种特殊的“别名”机制,它绑定到已经存在的变量上。一旦引用被初始化为某个变量,它就永久绑定到那个变量上,不能再绑定到其他变量。引用声明的基本语法是 type &name,其中 type 是引用所引用变量的类型,name 是引用的名字。

当使用传引用方式传递参数时,函数实际上接收到的是参数的引用,也就是说函数内部操作的是原始变量的直接引用,这会影响原始变量的值

int x = 10;
int &a = x; // a 是 x 的引用,a 和 x 现在是同一个变量的两个名字

在这里,& 符号表示a是对x的引用,不是取地址。对a的任何操作实际上都是对x的操作。

2.传值(int a

传值是指在函数调用时,实际参数的值被复制给函数的形式参数。这意味着,如果在函数内部改变了形式参数的值,它不会影响实际参数的值,因为它们是两个独立的变量。

当使用传值方式传递参数时,函数接收的是参数值的一个副本。这意味着函数内的任何操作都不会影响到原始数据。

void foo(int a) {
    a = 20; // 只改变了函数内的局部变量a,不影响外部的变量
}

int x = 10;
foo(x); // x 的值仍然是 10
  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值