学习笔记
文章目录
—2020.10.19—
1.main函数前加上数据类型原因
main函数的返回值返回给主调进程,一般情况下定义为int,并默认返回值为0时程序运行无错误,但是这一规定并非强制的。如果程序的运行结果不重要或者程序员不需要知道返回值,如所有的出错信息都已经在程序中有所体现,则可以省略返回值。在一些要求不严格的编译器比如VS、VC中可以把main定义为void,但是在一些比较严格的编译器中比如g++中则需要把main返回值定义为int。
2.int main()与int main(void)区别
int main()与int main(void)等价,但是前者表示对是否传入参数处于沉默状态,也就是说传不传参数都可以,而后者void表示不可以传入参数。
3.命名空间namespace
为什么要用命名空间,是因为有些名字可能会冲突,用命名空间解决这个问题。std是c++标准命名空间,是编译器自带的,如果达不到自己想要的效果,也可以自己定义一个mystd,用来输出。例如mystd::cout。
4.define 与 typedef
前者是在宏定义中,发生在预处理阶段,只是进行简单的字符串替换,不会进行检测,后者是发生在编译阶段,会进行数据类型检测。并且前者没有作用域的限制,后者有作用域的限制。
5.extern
首先我们要了解一个知识点,那就是一个变量可以申明很多次,但是只能定义一次。extern作用就是声明一个变量,比如extern int a;这条语句只是告诉程序有一个变量a,为int类型,但是没有为变量a开辟存储空间,只有在定义时才会给其分配空间:int a=10;这条语句定义了a=10。
6.static小计
首先我们看一下空间分配方式:全局变量、全局静态变量、局部静态变量储存在静态储存区,而局部变量则储存在栈里。一般情况下,一个全局变量被声明定义之后,如果存在多个源文件,那么在其他源文件也可以引用该变量,不过要先声明。而用static关键字修饰的变量,只在该源文件可被使用,也就是说其他源文件可声明定义相同名称变量,但是不能在未定义生声明情况下使用,即此时变量作用域为文件作用域,其他文件访问不了。static全局变量:改变作用范围,不改变储存位置;static局部变量:改变储存位置,不改变作用范围。
7.const小计
从右向左读;例如
char * const cp; ( * 读成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
const放在“*”左边,表示指针所指对象是只读的(指向常量的指针),也就是说可以改变指针的地址,但是里面保存的值不可改变;const放在 “*”右边,表示指针本身是只读的(指针常量),指针地址不可更改,但是里面内容可以更改。
—2020.10.30—
8.const与static
const定义的常量在超出其作用域时空间会被释放,而static定义的静态变量在函数执行之后也会保存在静态储存区,不会被释放,直至程序结束。
8.函数返回数组
正常情况下一个函数是不可以返回一个数组的,这时就可以运用指针。把要返回的函数设置成指针类型,则函数可以返回一个数组类型,示例代码如下:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
// 要生成和返回随机数的函数
int * getRandom( )
{
static int r[10];
// 设置种子
srand( (unsigned)time( NULL ) );
for (int i = 0; i < 10; ++i)
{
r[i] = rand();
cout << r[i] << endl;
}
return r;
}
// 要调用上面定义函数的主函数
int main ()
{
// 一个指向整数的指针
int *p;
p = getRandom();
for ( int i = 0; i < 10; i++ )
{
cout << "*(p + " << i << ") : ";
cout << *(p + i) << endl;
}
return 0;
}
9.引用与指针区别
用法类似。区别在于指针指向的是地址,而引用则是相当于给已经存在的变量取一个别名,那么根据这一层理解我们可以总结一下区别:1.可以存在空指针,定义一个指针指向NULL即可,但是不存在空引用。因为得先存在变量你才能取一个别名,这就相当于给人取外号,先存在这个人才能赋予外号,而不是先把外号取好,再决定把这个外号给谁;2.引用一旦指向一个对象,就不能改变,而指针可以改变所指对象。解释类似上面,取了外号不能换,这样大家才知道你说的是谁;3.引用创建时即被初始化,指针可以不被初始化。解释见第一点。
—2020.10.31—
10.构造函数与析构函数
构造函数用于初始化,析构函数用于释放内存。
11.内联函数
不要乱用!不要乱用!不要乱用!当函数语句不超过十行时可用。内联函数就是在编译时将程序中出现的调用内联函数表达式替换为内联函数体。并且内联函数中不要出现循环以及switch语句;内联函数的定义要在第一次调用内联函数之前。
—2020.11.02—
12.虚函数 virtual关键字
在此之前我们先搞清一个定义:静态多态。如果基类中有一个没有virtual关键字修饰的函数,那么在派生类中,当我们重写此函数并且在调用此函数时,编译器会自动调用基类当中的函数,这就是静态多态,也叫做静态链接/早绑定。所以,如果我们想要重写基类当中的函数,就需要用virtual关键字修饰,此时此函数为虚函数,此时就告诉编译器不要静态链接到基类当中的函数。此时这种我们的操作就叫动态链接/后期绑定。