作为一个c语言起步,c#为母语同时兼顾verilog的程序员来说,不会C++简直是笑话,准备系统的学习一下C++,把它用在QT开发上。
一、C++变量的使用
1、局部变量和全局变量
局部变量:在函数内定义的变量。
全局变量:在函数之外定义的变量。
2、变量的存储类别
(1)静态存储期:指程序运行期间,系统对变量分配固定的存储空间。存放全局变量。
(2)动态存储期:在程序运行期间,系统对变量动态地分配存储空间。
存放:函数的形参、局部变量、调用函数用的现场保护和返回地址。
3、静态局部变量:有时候希望函数中的局部变量在函数调用结束后不消失而保留原值,即占用的存储单元不释放,该变量保留上一次函数调用结束时的值,用的静态局部变量。在 变量前加 static
静态局部变量在静态存储区内分配存储单元,在程序运行的整个期间内都不释放。
4、变量声明和定义的区别:
广义的说声明包括定义,但是并非所有的声明都是定义。把建立存储空间的声明称为定义,把不需要建立存储空间的声明称为声明。
int main()
{
extern int a;//是声明。定义a是一个已定义的外部变量
}
int a;//是定义,定义a为整型外部变量
二、C++函数
1、根据函数能否被其他源文件调用,将函数分为内部函数和外部函数。
(1)内部函数:函数只能被本文件中的其他函数调用
在函数名前加static
static int fun(int a,int b)
(2)外部函数:如果函数的首部的最左端冠以关键词extern,则表示此函数是外部函数,可供其他文件调用。
通常省略extern时,则默认外部函数。
extern int func(int a,int b)
三、C++ 头文件和源文件
参考:https://blog.csdn.net/u012617944/article/details/78405686
通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。
C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是相对独立的,在编 译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。
1、头文件:是源文件之间的接口
所谓的头文件,其实它的内容跟.cpp文件中的内容是一样的,都是 C++的源代码。但头文件不用被编译。我们把所有的函数声明全部放进一个头文件中,当某一个.cpp源文件需要它们时,它们就可以通过“#include”包含进这个.cpp文件中,从而把它们的内容合并到.cpp文件中去。当.cpp文件被编译时,这些被包含进去的.h文件的作用便发 挥了。
比如:假设所有的数学函数只有两个:f1和f2,我们在主函数里调用这两个函数
(1)math.cpp
把它们的定义放在math.cpp里
double f1()
{
//do something here....
return;
}
double f2(double a)
{
//do something here...
return a * a;
}
(2)math.h
函数的声明放在一个头文件math.h中
/* **math.h** */
double f1();
double f2(double);
/* end of math.h */
(3)math.cpp
调用这两个函数,那么就只需要把头文件包含进来
/* main.cpp */
#include "math.h"
main()
{
int number1 = f1();
int number2 = f2(number1);
}
/* end of main.cpp */
需要注意的是,.h文件要在编译器找得到的地方(比如跟main.cpp在一个目录下)。 main.cpp和math.cpp都可以分别通过编译,生成main.o和math.o,然后再把这两个目标文件进行链接,程序就可以运行了。
#include的含义:它在编译器进行编译之前,即在预编译的时候就会起作用。#include的作用是把它后面所写的那个文件的内容,完完整整地、 一字不改地包含到当前的文件中来。简单的文本替换,别无其他。因此,main.cpp文件中的第一句(#include “math.h”),在编译之前就会被替换成math.h文件的内容。即在编译过程将要开始的时候,main.cpp的内容已经发生了改变。
2、头文件的内容:
头文件中应该只放变量和函数的声明,而不能放它们的定义。有三个例外:可以写const对象的定义、可 以写内联函数(inline)的定义、写类 (class)的定义。
(1)对类型的声明
(2)函数声明
(3)内置函数的定义
(4)宏定义
(5)全局变量的定义
(6)外部变量的定义
(7)根据需要包含其他头文件
头文件中通常包含那些只能被定义一次的的实体,如类(class),结构体(struct),const, constexpr变量(C++11,用常量表达来赋值的常量),inline函数。如果头文件中只包含这些实体,即使头文件中不使用#pragma once或者#ifndef _TEST_, #define _TEST_, #endif。也不会出错,只不过是被包含的头文件可能会被包含多次,从而影响编译效率。但是不会出现重定义的错误。
C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是相对独立的,在编 译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。
比如,在文件a.cpp中定义 了一个全局函数“void a() {}”,而在文件b.cpp中需要调用这个函数。即使这样,文件a.cpp和文件b.cpp并不需要相互知道对方的存在,而是可以分别地对它们进行编译, 编译成目标文件之后再链接,整个程序就可以运行了。 在文件b.cpp中,在调用 “void a()”函数之前,先声明一下这个函数“void a();”,就可以了。这是因为编译器在编译b.cpp的时候会生成一个符号表(symbol table),像“void a()”这样的看不到定义的符号,就会被存放在这个表中。再进行链接的时候,编译器就会在别的目标文件中去寻找这个符号的定义。一旦找到了,程序也就可以 顺利地生成了。