C++学习笔记1(变量、函数、头文件)

作为一个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()”这样的看不到定义的符号,就会被存放在这个表中。再进行链接的时候,编译器就会在别的目标文件中去寻找这个符号的定义。一旦找到了,程序也就可以 顺利地生成了。

猜你喜欢

转载自blog.csdn.net/kenjianqi1647/article/details/83830594
今日推荐