所有的知识全都会通过代码例子的形式讲解,而有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:
如果我们要通过指针来调用 Person
的 sayHello
函数:
#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