499689317 / notes

note
2 stars 0 forks source link

C++相关 #1

Open 499689317 opened 7 years ago

499689317 commented 7 years ago

strlen统计字符串长度

strlen(char* ptr);

这个方法统计的字符串长度不包括'/0'

数组越界问题

char* str[10];

不能添加多于9个字符的字符串(数组添加字符串时最后一个字符要留给'\0',否则数组越界)

strcpy(char str, const char str2)实现

char* strcpy(char* str, const char* str2) {
    if(str == NULL || str2 == NULL) {
        return NULL;
    }
    char* ptr = str;
    while( (*str++ = *str2++) !="\0" );
    return ptr;
}

用const标识str2为输入字符串(只读字符串) 将新字符串返回实现链式操作

strcpy(char str, const char str2)实现

int strlen(const char* str) {
    if(str == NULL) {
        return 0;
    }
    int len = 0;
    while( (*str++) != '\n' ) {
        len++;
    };
    return len;
}

操作符优先级

++/--(自增与自减符)的优先级高于*(取地址符)

函数参数(传值/传指针/传引用)

传值(单向传递) 传指针(单向传递) 传引用(双向传递)

函数返回值

可以返回基本类型的局部变量(副本被返回, 原数据其实已经被释放) 返回复杂类型的局部变量是非常危险的

野指针不能去操作

数组:

数组名作为函数形参时,变为普通指针,与指针的操作是一样的可以自增自减等操作 数组名可以是指代当前数组这种数据结构: int arr[10];printf(sizeof(arr), %d);// 40 (指代当前这个数组)(作为一个指针常量不能自增自减)

宏实现类似函数功能:

#define MIN(a, b) ( (a) < (b) ? (a) : (b) )

宏定义后面是不跟分号的

头文件:

防止头文件重复包含 extern关键字与"c"一起连用时,如: extern " c" void fun(int a int b) 则告诉编译器在编译fun这个函数名时按着c的规则去翻译相应的函数名而不是c++的, c++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun abc_int_int#$也可能是别的,不同的编译器采用的方法不一样,因为c++支持函数的重载 当extern不与" c" 在一起修饰变量或函数时,如在头文件中: extern int g_int 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块和其他模块中使用,记住它是一个声明不是定义,也就是说模块b(编译单元)要是引用模块a(编译单元)中定义的全局变量或函数时,它只要包含模块a的头文件即可。在编译阶段,模块b虽然找不到该函数或变量,但它不会报错,它会在连接时从模块a生成的目标代码中找到此函数。

const与static作用:

const:

const可以阻止一个变量被改变 const可以作用于指针,指针所指向的值,或者两者都作用 const形参表明这是一个输入参数,在函数内不能改变其值 const成员函数,是类的常函数,不能改变类的成员变量

static:

函数内变量使用static,每次调用都会使用上一次调用的值,不会释放 在模块内声明static全局变量只能被模块内所有方法调用,不能被模块外方法调用 在模块内的static方法只能被模块内调用,使用范围被限制在声明他的模块内 类中声明的static成员变量属于整个类所有,对类的所有对象只有一份拷呗 类的static成员函数属于整个类所有,不接收this指针,所以只能访问类的static成员变量

C语言运算中规定,如果整型变量间进行数据运算,只要有一个变量是无符号的,结果按无符号数据输出

unsigned int a = 6;
int b = -20;
(a + b > 6) ? (puts(">6")) : (puts("<=6"))

结果为:(a + b) > a === ">6"

全局变量,静态全局变量,静态局部变量,局部变量

内联函数可以减少函数调用的开销

函数返回局部变量