提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:本文介绍c++的一些基本语法:
本着对C语言的热爱,想着再续前缘,继续选一门语言学习,网上吹Java太魔幻了,诸如base广州,面了四五家公司,拿了7个offer,趁着互联网红利期赶快入行,狠狠地赚一笔,再加上铺天盖地的学习路线,C++是一股清流,虽然事实是Java的岗位需求比C++高,但C++比Java的薪资高,相对也没那么卷。大家感兴趣的话可以做一个调研,很多大学的计算机课程中Java是必修课,反而C++是选修课,不难得出,在校招的时候大部分人都会投Java,C++的机会相对大了一些。不过语言不是重点,可能C++er招进去转写go,写java,哪个组缺人往哪跑,所以语言并不是重点,成为一门合格的工程师更看重的是一些偏底层的对象,比如算法能力,网络协议,Linux等等等等,我们所学所准备的东西只是给HR一个结果,让HR看到你的学习能力,这才是最重要的。
以下数据来自BOSS直聘,牛客网
在当今这个大学生就业压力巨大的现在,应届的学生能拿到20~30w的薪资,这已经是很可观了
一、第一个C++程序
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
return 0;
}
#include<iostream>
调库函数
using namespace std;
命名空间的展开,给该cpp文件授权访问std,如果不加此句,下面代码变成
std::cout << "Hello World" <<std::endl;
“cout<<i<<endl” 是 C++ 程序设计语言中的标准输出语句,其中 “cout” 是 C++ 中的标准输出流对象, “<<” 是流插入运算符, “i” 是变量, “endl” 是换行符。它的意思是将变量 “i” 的值输出到屏幕上,并在输出后换行。
二、函数重载
概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题
实操
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
函数重载
void func(int i, double d)
{
cout << "void func(int i, double d)" << endl;
}
void func(double d,int i)
{
cout << "void func(double d,int i)" << endl;
}
int main()
{
func(1, 1.1);
func(1.1, 1);
return 0;
}
运行结果:
由此看出,C++很聪明,很智能得识别实参的类型并进行分类使用
原理
函数名修饰规则
_z+函数名字节数+函数名+实参首字母缩写
func(int i, double d)修饰为_z4funcid
从汇编的结果可以验证
程序运行的过程
test.cpp
预处理-头文件展开,宏替换,去注释,条件编译(#ifdef)
test.i
编译 检查愈发,生成汇编代码(指令代码)
test.s
汇编 将汇编代码生成二进制机器码
test.o
链接 合并链接,生成exe
函数名修饰规则cpp
三、引用
概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间。
比如鲁智深,他的外号叫花和尚,绰号是天立星双枪将,这三个名字都是指同一个人
示例
int main()
{
int a = 0;
int& b = a;
cout << &a << endl;
cout << &b << endl;
return 0;
}
运行结果
引用的特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,再不能引用其他实体
便于接收参数
不用指针版本的Swap函数
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
性能测试
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include <time.h>
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue()
{
A a;
// 以值作为函数参数
size_t begin1 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc1(a);
size_t end1 = clock();
// 以引用作为函数参数
size_t begin2 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc2(a);
size_t end2 = clock();
// 分别计算两个函数运行结束后的时间
cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}
int main()
{
TestRefAndValue();
}
可以看出引用的效率是指针的7倍
总结
欢迎评论区指正交流