首页 > 代码库 > C++学习笔记1--基础知识

C++学习笔记1--基础知识

#include <iomanip>
setpresition(int n); 设置浮点数的输出精度为n.
【goto语句】
goto又称为无条件转移语句买勇于改变语句的执行顺序。goto语句的一般格式为:
goto 标号;
例:
#include <iostream>
using namespace std;
int main(int args, char *argv[]) {
    int ivar = 0;
    int num = 0;
label:
    ivar ++;
    num += ivar;
    if(ivar < 10) {
        goto label;
    }
    cout << num << endl;
    return 0;
}

goto语句效率较低。
goto语句不能越过复合语句之外的变量定义的语句。
调用默认参数的函数用法举例:
#include <iostream>
using namespace std;
void OutputInfo(const char* pchData=http://www.mamicode.com/"Stay hungry,Stay foolish.") {>
【可变参数】
声明可变参数的函数和声明普通函数一样,只是参数列表中有一个"..."。例如:
void OutputInfo(int num, ...)
对于可变参数的函数,在定义函数时需要一一读取用户传递的实际参数。可以使用va_list类型和va_start、va_arg、va_end 3个宏读取传递到函数中的参数值。使用可变参数需要引用STDARG.H头文件。
例:定义并调用可变参数函数
#include <iostream>
#include <stdarg.h>
using namespace std;
void OutputInfo(int num,...) {
    va_list arguments;
    va_start(arguments, num);
    while(num--) {
        char *pchData = http://www.mamicode.com/va_arg(arguments,char*);>
重载函数:指多个函数具有相同的函数标识符,但参数类型或参数个数不同。函数调用时,编译器以参数的类型及个数来区分调用哪个函数。
【内联函数 inline】
使用内联函数可以减少函数调用带来的开销(在程序所在文件内移动指针寻找调用函数地址带来的开销),应该在函数实现代码很简短或者调用该函数次数相对较少的情况下将函数定义为内联函数。
变量的存储类别:auto; static; register; extern
 auto变量:C++中默认的存储类型
  自动变量的作用域仅限于定义该变量的个体内。动态存储,栈中不同个体中允许使用同名的变量而不会混淆。
 static变量:
  在函数中定义就在函数中使用;但生命期为整个程序。
 register变量:
  寄存器变量将局部变量的值存放在CPU的寄存器中,使用时不需要访问内存,而直接从寄存器中读写。
  (1)寄存器变量属于动态存储方式。凡需要使用静态存储方式的变量不能定义为寄存器变量。
  (2)编译程序会自动决定哪个变量使用寄存器存储。register可以起到程序优化的作用。
 extern变量:
  在使用其他源文件的全局变量时,只需要在本源文件中使用extern关键字来声明这个变量即可。
指向函数的指针:指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址,这个函数入口地址就称为函数的指针,可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
例:
#include <iostream>
#include <iomanip>
using namespace std;
int avg(int a, int b);
int main(int argc, int *argv[]) {
    int iWidth, iLength, iResult;
    iWidth = 10;
    iLength = 30;
    int (*pFun)(int, int); //定义函数指针
    pFun = avg;
    iResult = (*pFun)(iWidth,iLength);
    cout << iResult << endl;
    return 0;
}
int avg(int a, int b) {
    return (a+b)/2;
}

【引用】
引用的形式:
数据类型 & 表达式
例如:
int a = 10;
int & ia = a;
ia = 2;
定义了一个引用变量ia,它是变量a的别名,对ia的操作与对a的操作完全一样。ia=2把2赋给a,&ia返回a的地址,执行a=2和执行ia=2等价。
使用引用的说明:
(1)一个C++引用被初始化后,无法使用它再去引用另一个对象,它不能被重新约束。
(2)引用变量只是其他变量的别名,对他的操作与原来对象的操作具有相同作用。
(3)指针变量与引用有两点主要区别:一个指针是一种数据类型,而引用不是一个数据类型,指针可以转换为它所指向变量的数据类型,以便赋值运算符两边的类型想匹配;而在使用引用时,系统要求引用和变量的数据类型必须相同,不能进行类型转换。二是引用使用起来比指针方
便。
(4)引用应该初始化,否则会报错。
使用引用传递参数
swap(int &a, int &b) {
    int tmp = a; a = b; b = tmp;
}
指针传递参数
swap(int *a, int *b) {
    int tmp = *a; *a = *b; *b = tmp;
}
a[i][j] == *(*(a+i)+j)
【指针数组】
一维指针数组的定义形式为:
类型名 *数组名[数组长度];
例如:int *p[5];
指针数组中的数组名也是一个指针变量,该指针变量为指向指针的指针。
例:使用结构体指针变量引用结构体成员。
#include <iostream>
using namespace std;
int main(int argc, int *argv[]) {
    struct PERSONINFO {
        int index;
        char name[30];
        short age;
    }*pPersonInfo, pInfo={0,"lasolmi",21};
    pPersonInfo = &pInfo;
    cout << pPersonInfo->index << endl;
    cout << pPersonInfo->name << endl;
    cout << pPersonInfo->age << endl;
    return 0;
}

【结构体的嵌套】
(1)在结构体中定义子结构体。
(2)在定义时声明其他已定义好的结构体变量。
可在声明结构体数组时直接对数组进行初始化:
struct PersonInfo {
    int index;
    char name[30];
    short age;
}Person[4] = {
    {1, "figo", 23},
    (2, "ling", 22),
    (3, "me", 21),
    (4, "cong", 20)
};

【共用体】
定义共用体类型的一般形式为:
union 共用体类型名 {
    成员类型 共用体成员名1;
    成员类型 共用体成员名2;
    ...
    成员类型 共用体成员名n;
};

共用体的大小:共用体每个成员分别占有自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。一个共用体变量不能同时存放多个成员的值,某一时刻只能存放其中的一个成员的值,这就是最后赋予它的值。
【枚举类型】
常见的枚举类型声明形式:
enum 枚举类型名
{
    标识符[=整型常量];
    标识符[=整型常量];
    标识符[=整型常量];
}枚举变量;
范例:枚举变量的赋值。
#include <iostream>
using namespace std;
int main(int argc, int *argv[]) {
    enum Weekday {Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
    int a = 2 , b = 1;
    Weekday day;
    day = (Weekday)a;
    cout << day << endl;
    day = (Weekday)(a-b);
    cout << day << endl;
    day = (Weekday)(Sunday+Wednesday);
    cout << day << endl;
    day = (Weekday)5;
    cout << day << endl;
    return 0;
}

输出结果为:
2
1
3
5
【自定义数据类型】
typedef <原类型名> <新类型名>
例:
typedef in INTEGER;
INTEGER a, b;
等价于:
int a, b;

C++学习笔记1--基础知识