学完C语言后,需要再学一门面向对象的高级语言,C++是不二之选,笔记中对C++某些地方的理解是建立在C语言基础上的,并且举例了C语言和C++知识点之间的不同。
此篇文章中介绍了C++的常用语法,并与C语言之间进行对比(C++的语法大部分是包含C语言的)。
Hello World
下面是一个输出"Hello World!"的程序:
#include <iostream>
using namespace std;
int main(void)
{
char *sData = "Hello World!";
cout << sData << endl;
system("pause");
return 0;
}
(一)头文件
//C语言
#include <stdio.h>
//C++
#include <iostream>
(二)输入输出
//输入输出字符串
char sData[20];
scanf( "%s", sData); cin >> sData ;
printf( "%s \n", sData); cout << sData << ' ' << endl;
//输入输出整数
int iData = 0;
scanf( "%d", &iData); cin >> iData ;
printf( "%d \n", iData ); cout << iData << ' ' << endl;
输入输出字符串两者利用的都是变量的地址
输出整数两者利用的都是变量的值,但输入整数C语言利用变量的地址,而C++利用变量的值。看一下 cin >> iData 的原型,大致如下:
istream &operator >> (int &x);
使用了引用传递,即x是iData的别名,两者拥有相同的地址,在函数内部也是利用变量的地址进行值的修改,不过这样的好处是在使用 cin 时不用再添加取值符 &。而C语言目前还没有引用,因此无论输入字符串还是整数,都是利用变量的地址。
cont是可连续输出,自动识别类型的。endl是换行且多了一个刷新缓冲区的操作,但效率比'\n'慢了。
(三)命名空间
namespace std
{
void sort()
{
cout <<"Hello !"<< endl ;
}
}
打开的三种方法:
直接调用 std::sort() ;
开头包含 using namespace std; 调用sort();
开头包含 using std::sort; 调用sotr();
注意:
需要保证的是尽量不要在头文件里using任何东西尤其是namespace,要不然include进来的时候很容易莫名其妙产生命名冲突,而且头文件是相互套用的,“尽量不扩大using namespace xxx所影响到的域”。
不要using namespace std从理论上来说也是有道理的:因为系统库可能会升级,这样升级编译使用的C++版本的时候有可能因为引入了新的符号跟自己代码里的命名冲突。但一般来说,升级C++版本最多几年也就做一次,冲突的可能性也并不大,而升级C++版本本来也不一定能保证编译成功,为了这种特殊时候省一点时间让平时的编码和阅读都变费劲并没有什么道理。
然而名称空间的支持者希望有更多的选择,既可以使用解析运算符面也可以使用using声明,也就是说,不要这样做:
using namespace std; // avoid as too indiscriminate(随意)
而应这样做
int x;
std::cin >> x ;
std::cout << x << std::endl;
或者这样做
using std::cin;
using std::cout;
using std::endl;
int x;
cin >> x;
cout << x << endl;
(四)结构体(C++通用C写法)
struct Node
{
int a;
}
//C语言
struct Node b;
里面可以放函数指针 void (*p)();
//C++
(struct) Node b; //可以不用struct
里面可以直接放函数 void fun(){~~~~~~};
(五)分配连续空间(C++通用C写法)
//C语言
char *p = (char *)malloc(5*sizeof(char));
free(p);
//C++
char *p = new char[5]; //分配5个连续的内存会触发构造函数
int *p = new int(10); //分配1个内存,并且初始化值为10
delete[] p; //会触发析构函数;前后类型 一定要匹配
(六)函数参数
//C语言
void fun(int a,int b,int c)
fun( 2,3 );
//C++
void fun(int a,int b=2,int c=3) //参数缺省值/默认值 部分指定:从右向左连续指定
fun( 1 ); //int a没指定默认值,一定要传递实参
(七)防止头文件重复包含(C++通用C写法)
//C语言
#ifndef ABC
#define ABC
void fun();
#endif
//C++
#pragma once //取决于编译器,有的编译器不能用
void fun();
(八)文件操作(文本文件)
//C语言
#include <stdio.h>
FILE *fp;
char buf[] = "Hello World!";
char readbuf[1024];
fp = fopen( "文件", "w+");
ifs.open( "文件", ios::in );
fwrite( buf, sizeof(char), sizeof(buf), fp );
fread( readbuf, sizeof(char), sizeof(readbuf), fp );
close( fp );
//C++
#include <fstream>
ofstream ofs;
ifstream ifs;
char readbuf[1024];
ofs.open( "文件", ios::out );
ofs << "Hello World!" << endl;
rewind( fp );
while ( ifs.getline( buf, sizeof(buf) ) );
ofs.close();
除此之外,if, while, switch, try 等常用语句,都和C语言的用法一样。
(九)变量起别名(引用)
int a = 12;
int &c = a; //声明变量a的一个引用c,c是变量a的一个别名,声明时就要初始化
int *p = &a; //p里装的内容就是a的地址
与C的指针不同,指针变量就是一个变量,这个变量本身要存储在内存中,指针变量所在内存中存储的就是这个指针变量所指向的地址
而c是直接关联a的空间的,即c是a的另一个名字,初始化后就不能指向其他的了
cout<<&a<<' '<<&b<<' ’<<p<<' '; //输出的地址是一样的 &p才是p的内存地址
引用和指针的区别:
引用的本质是指针常量:
下一篇《C++笔记,类的创建和函数对象》
个人公众号:拾一札记
参考资料:
C3程序猿:https://www.bilibili.com/video/BV1rW411R7g4