C++ 的发展历史
语法须知
- C++的源文件扩展名是:cpp(c plus plus的简称)
- C++程序的入口是main函数(函数即方法,一个意思)
- C++完全兼容C语言的语法,很久以前,C++叫做C with classes
cin与cout
C++中常使用cin、cout进行控制台的输入、输出
- cin用的右移运算符>>,cout用的是左移运算符<<
- endl是换行的意思
#include <iostream>
using namespace std;
// 在Java的世界里,先有类,再有方法(函数)
int main() {
//cout << "Hello World!" << endl;
/*cout << "Hello";
cout << endl;
cout << "World!";*/
//cout << "Hello" << endl << "World!";
/*int age;
cin >> age;
cout << "age is " << age << endl;*/
// Shift + F5:退出程序
// Ctrl + SHift + F5:重启程序
// 以上快捷键只针对F5启动的程序
int a = 10;
int b = a >> 2;
// 面向对象 + 运算符(操作符)重载
// 等待键盘输入
getchar();
return 0;
}
函数重载(Overload)
- 规则
- 函数名相同
- 参数个数不同、参数类型不同、参数顺序不同
- 注意
- 返回值类型与函数重载无关
- 调用函数时,实参的隐式类型转换可能会产生二义性
- 本质:采用了name mangling或者叫name decoration技术
- C++编译器默认会对符号名(变量名、函数名等)进行改编、修饰,有些地方翻译为“命名倾轧”
- 重载时会生成多个不同的函数名,不同编译器(MSVC、g++)有不同的生成规则
- 通过IDA打开【VS_Release_禁止优化】可以看到
#include <iostream>
using namespace std;
/*
C语言不支持函数重载
*/
// g++
// msvc
// display_v
void display() {
cout << "display() " << endl;
}
// display_i
void display(int a) {
cout << "display(int a) " << a << endl;
}
// display_l
void display(long a) {
cout << "display(long a) " << a << endl;
}
// display_d
void display(double a) {
cout << "display(double a) " << a << endl;
}
// 逆向工程
int main() {
display();
display(10);
display(10l);
display(10.1);
getchar();
return 0;
}
extern “C”
- 被extern "C"修饰的代码会按照C语言的方式去编译
- 如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰
- 由于C、C++编译规则的不同,在C、C++混合开发时,可能会经常出现以下操作
- C++在调用C语言API时,需要使用extern "C"修饰C语言的函数声明
- 有时也会在编写C语言代码中直接使用extern “C” ,这样就可以直接被C++调用
#include <iostream>
//extern "C" {
#include "sum.h"
//}
// C语言库
using namespace std;
//extern "C" void func() {
// cout << "func()" << endl;
//}
//
//extern "C" void func(int a) {
// cout << "func(int a) " << a << endl;
//}
//extern "C" {
// void func() {
// cout << "func()" << endl;
// }
//
// void func(int a) {
// cout << "func(int a) " << a << endl;
// }
//}
//extern "C" void func();
//extern "C" void func(int a);
//extern "C" {
// void func();
// void func(int a);
//}
int main() {
/*func();
func(10);*/
cout << sum(10, 20) << endl;
getchar();
return 0;
}
//void func() {
// cout << "func()" << endl;
//}
//
//void func(int a) {
// cout << "func(int a) " << a << endl;
//}
#include "sum.h"
// _sum
int sum(int a, int b) {
return a + b;
}
int minus(int a, int b) {
return a - b;
}
#ifndef __SUM_H
#define __SUM_H
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
int sum(int a, int b);
int minus(int a, int b);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // !__SUM_H