CPP基础知识(一)

205 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

Visual Studio

创建项目后,vs会自动生成一些文件.

sln solution 文件 保存项目结构

filters

vcxproj

vs自动生成的文件结构非常混论,建议点击显示所有文件按钮后,添加src文件夹存放源代码。

常用项目配置

输出目录:(SolutionDir)bin\(Platform)$(Configuration)\

中间目录:(SolutionDir)bin\intermediates\(Platform)$(Configuration)\

编译器

一、预编译 preprocessor

1、#define

#define INTEGER int

//编译器在预编译时会将define修饰的内容全部替换,
//此处例子中会将INTEGER替换为int
INTEGER Multiply(INTEGER a,INTEGER b){
}

2、#include

编译器在预编译时会将include的文件内容复制到当前文件中。cpp标准库没有文件后缀,例如iostream ,而c语言标准库又.h后缀,例如stdlib.h。

#include<iostream> //特点include路径用<>  
#include "test.h"  //相对路径用""

3、#if endif

#if condition
blablabla  //只有当condition为真时,此内容才会被编译
#end if 

4、#pragma once

只include该文件一次,往往出现在.h文件中,防止头文件被include到同一个cpp中多次。可以代替以前#ifndef #endif的作用,起到头文件保护的作用。

#ifndef _FLAG_H
#define _FLAG_H
blablabla  //当该文件被include一次后_FLAG_H就已经被define了,
           //如果第二次被include,blabla内容就不会执行
#endif

二、编译为obj (translation unit)

obj file 就是一堆只有cpu认识的二进制数,可以在项目属性中更改输出文件,让编译器输出asm代码,使其具有可读性

链接器 Linking

把多个obj文件,及程序所要用到的库链接在一起

.h 文件放函数declaration

#pragma once
using namespace std;
void countStr(const string str);

.cpp放函数

#include <iostream>
#include <string>
#include "countStr.h"

using namespace std;


int main(char argc, char** argv) {
	string str;
	cin >> str;
	countStr(str);
}
#include <iostream>
#include <string>


using namespace std;

void countStr(const string str) {
	for (int i = 0; i < str.length(); i++) {
		cout << i << endl;
	}
}

头文件 .h

一般用来放函数声明,然后就可以在需要调用的地方#include "***.h"

指针(Pointer)

指针是cpp以及c语言中最重要的概念之一,本质上来说指针是一个存储变量内存地址的整数,指针类型对指针本身并无任何意义,他只是告诉编译器指针指向变量的大小。

#include<iostream>
#define LOG(x) cout<<x<<endl;
using namespace std;

int main(int argc, char** argv) {
	char* buffer = new char[8];   //在堆(heap)内创建8字节空姐
	memset(buffer, 0, sizeof(buffer));//将buffer置为0
	LOG(buffer);
	char** buffer_ptr = &buffer;//指向指针buffer的指针
	LOG(buffer_ptr);
	**buffer_ptr = 10;//改变的是指向buffer指针对应的值,从0变为10
	LOG(buffer);
}

#include<iostream>
#define LOG(x) std::cout<<x<<std::endl;

int main(int argc, char** argv) {
	char* buffer = new char[8];
	memset(buffer, 65, sizeof(buffer));
	LOG(buffer);  //输出指针指向的8字节内存中的值,因为是char,所以用ascii解析
	char** buffer_ptr = &buffer;
	LOG(buffer_ptr);
	**buffer_ptr = 97;
	LOG(*buffer); //只输出指针指向的内存地址的值,因为是char类型,只有1字节,并用ascii解析
}

cpp中的const只修饰其右边的内容

const int* a = new int;
b=2;
*a = 2;//报错,因为const修饰了*a其为常量,即不能更改指针指向地址的值
a = (int*)&b;//不报错,这里我们更改了指针指向的地址
int* const a = new int;
*a = 2;//不报错,因为const修饰了a即指针
a = (int*)&b;//报错

引用(reference)

从汇编代码来看cpp中的引用本质上就是指针,(汇编中的指针和引用代码一模一样),是削弱后的指针。引用必须引用一个已存在的变量,即必须初始化,并且初始化后不可改变。引用本身不是变量,可以把他当成变量的别名。CPP中尽量多使用引用,既节省资源有比指针更加安全。

int& ref = a; //ref必须先初始化,即赋一个变量。