初次写博客记录自己的C++学习之旅,算是自己的一个小笔记本吧!希望能坚持写下去,不断输出,提高自己。
C++简介
C++是C语言的扩展, 同时,
1.更加关注语言性能
与底层硬件紧密结合;程序员能对变量的生命周期做到精确控制;不需要为没有使用的语言特性付出代价如虚函数的使用;使用了语言特性不等于付出运行成本,因为有的被编译器提前编译好了的。(搞不懂没关系,只要知道C++很牛就行了)
2.引入了大量的特性,便于工程实现
三种编程范式:面向过程 面向对象 泛型编程
函数重载 异常处理 引用等。
C++最初是1998年开始 03年改进 11年引入了许多新特性,14、17、20对标准进一步迭代。但是C++11应用更加广泛吧。
00g++常见编译参数介绍
//-g 带调试信息的可执行文件
g++ -g test.cpp
//-O[n]优化代码
// -O0 不做优化 -O1 默认优化 -O2除了默认优化还有一些额外优化 -O3进一步优化
//注意优化后的代码 不能调式 一般在确认无误后使用优化 提高运行效率
g++ O2 test.cpp
// -l 指定库文件 -L指定库文件路径
g++ -L/home/lib/mytestlib -lmytest test.cpp
// 链接/home/lib/mytestli下的mytest.so库
//-I 指定头文件搜索目录
g++ -Imyinclude test.cpp
//-std=c++11 使用c++11标准
g++ -std=c++11 test.cpp
// -o 指定输出文件名
g++ test.cpp -0 test
// man gcc 可查看gcc文档
01C++的编译/链接
流程:预处理 编译 汇编 链接
mkdir tmp
cd tmp
touch test.cpp
vim test.cpp
#include<iostream>
using namespace std;
int main()
{
cout<<"This is a test!"<<endl;
return 1;
}
1.预处理 Pro-processing (将源文件和头文件变为翻译单元 源文件+头文件下相关文件-忽略的处理语句)
g++ -E test.cpp -o test.i
2.编译 Compilling (将翻译单元变为汇编语言文件)
g++ -S test.i -o test.s
3.汇编 Assembling (将汇编文件转化为机器语言的目标文件)
g++ -C test.s -o test.o
4.链接 Linking (链接多个文件 生成可执行文件)
g++ test.o -o test
具体每一步生成什么可以cat test.i 查看 -o 指定文件名
以上四步可一步代替 g++ test.cpp -o test 但必须明白它包含了四步操作。
预处理常见的问题
预处理即将源文件和头文件转化为翻译单元的过程,所以就必须防止头文件的循环包含。
// main.cpp
#include"swap1.h"
// swap1.h
#include"swap2.h"
//swap2.h
#include"swap1.h"
在main中 包含swap1 swap1包含swap2 swap2又包含swap1三者循环包含 编译报错
处理1
头文件加上#pragma once (防止头文件重复包含)
#include<iostream>
#pragma once
#include"swap1.h"
int main()
{
.......
}
处理2
#ifndef SWAP2_H
#ifdef SWAP2_H
........
.......
#endif
持续更新,,,,,
02书写Hello World
#include<iostream>
int main(int argc ,char * argv[])
{
std::cout<<"Hello world\n";
return 0;
}
main特殊的函数 作为整个程序的入口
返回类型只能是int 通常用0来表示正常返回 可用 $? 查看返回值
such as: g++ test.cpp -o main ./main $?
void func(const char * pInfo, int)
{
cout<<pInfo;
return ;
}
函数返回类型可以是void return; 表示不返回值
函数名--用于函数的调用
形参列表--是函数接受的值 可以是空 可以是void (不常见) 可以无形参也可以是占位参数
such as : void fun(const char * info ,int )
03系统IO流
iostream --标准库提供的IO接口 用于用户交互
输入流:cin--从键盘输入
输出流:cout---输出目标 cerr--刷新缓冲区 clog--不立即刷新缓冲区
std::flush --缓冲区 std::endl --缓冲区刷新和换行 \n --只换行
std::cout<<"I am Tim"<<endl; ---刷新了缓冲区和换行
std::cout<<"I am Tim\n"; ---只换行
#include<iostream> --系统从标准库中索引头文件
#include"head.h" --系统从当前目录索引头文件 及用户自定义的头文件
namspace nn
{
void func()
{
std::cout<<"hello nn\n";
}
}
自定义命名空间 防止重复 有三种使用方法;
1.nn::func() --推荐使用
2.using namspace nn
func()
3. namespace ysq=nn;
ysq::func()
输出:
int x=9;
std::cout<<"I have"<<x<<"apples\n";
printf("I have %d apples\n",x) 需要包含C的头文件#include<cstdio>
04控制流
#include<iostream>
#include<cstdio>
int main()
{
std::cout<<"Please input a number:\n";
int y=0;
std::cin>>y;
if(99==y) ==判断字符 将常量放在==左边防止误用 if(99=y) 则报错
{
std::cout<<"You are right!\n";
}
else
{
std::cout<<"You are wrong!\n";
}
return 0;
}
05结构体
1.通过 . 访问内部元素
2. 可以作为输入参数 或者返回值
3. 可以引入成员函数
#include<iostream>
struct Point
{
int x;
int y;
void nn()
{
x=x+1;
y=y+1;
}
};
Point func(Point p)
{
p.x=p.x+1;
return p;
}
int main()
{
Point p;
p.x=1;
p.y=11;
p=func() ----结构体做输入参数 做返回值类型
//p.nn(); -----结构体内建成员函数 更像一个类!!
std::cout<<"x= "<<p.x<<"y= "<<p.y\n;
return 0;
}
持续更新,,,