C++学习笔记01
C++函数:
C函数潜规则:
1.默认返回int类型
2.空参数表示参数个数随意
C++以上两点作废
重载/形参/实参/哑元
哑元: sort(int a[],int n,int method)->sort(int a[],int n,int)
函数的声明和定义可以分开,有默认值的参数写在声明定义里不用写以免冲突
宏函数/内联函数
基本不用,一是不符合强类型要求,二是副作用取而代之的是内联函数用inline表示。 内联函数会在调用的地方展开函数代码而不是产生调用,跟宏函数一样高效,单却又明确的参数类型没有副作用。是否真正执行inline的要求,完全由编译器自己决定。
inline int max(int a,int b) { return a<b?b:a; }
动态内存管理
C
malloc/free/calloc/realloc,返回void*不适用于强类型的C++
C++
new 类型
n new 类型(初始值)
new 类型[元素个数]
delete 地址
delete[] 地址
new(指定地址)类型:在指定的地方分配内存(少用)
指定初始值直接用一对空圆括号的称为零初始化
char* p = new char(); *p =='\0'
new失败会throw抛出异常导致程序终止,可以用nothrow来在申请内存失败时像C的内存管理函数一样返回NULL,头文件<new>
古怪的指针:成员指针 Date::*p = &Date::year;
直接上例子
#include<iostream> using namespace std; struct Date{ int year; int month; int day; void print(){cout<<year<<'-'<<month<<'-'<<day <<',' ;} }; void sort(Date a[],int n, int Date::*p) { for(int i = 0;i<n;i++) for(int j = i+1;j<n;j++) if (a[i].*p > a[j].*p) swap(a[i],a[j]); } int main() { int Date::*p = &Date::year; Date a = {2013,1,16},b= {2008,8,8}; cout<< a.*p<<','<<b.*p<<endl; p = &Date::day; cout<< a.*p<<','<<b.*p<<endl; Date x[4] = {a,b,{1970,1,1},{2012,12,21}}; for(int i = 0 ;i<4;i++) x[i].print(); cout<<endl; sort(x,4,&Date::month); for(int i = 0 ;i<4;i++) x[i].print(); cout<<endl; system("pause"); }
引用
本质上是指针,编译器自动取地址和加星号
通俗讲法 引用就是变量的别名
定义:类型& 名字=初始值;
引用必须初始化,用谁初始化它,它就跟谁是同一体,这种关系一生一世永远不变
void swap(int& p,int& q) & 就是跟编译器的约定,编译器把细节隐藏了
#include<iostream> using namespace std; void swap(int& p,int& q) //void swap(int* p,int* q) { int t = p;//int t = *p; p = q; //*p=*q; q = t; //*q=t; } int main() { int a=10,b=20; swap(a,b); //swap(&a,&b); cout<<a<<','<<b<<endl; system("pause"); }
特别说明:形参是在调用时由实参初始化,返回值是由返回时由return后面的数据初始化。
int sum(int a,int b) { int s = a+b; return s; } int x = sum(3,5);
引用直接使用变量本身(同一体)而不是复制数据,引用不是新的数据类型而是传递方式
字符串:
C风格字符串数组长度问题,忘记末尾的‘\0’
C++风格的字符串string类型,头文件string,同样支持像字符数组那样按下标访问元素,支持 + +各种比较运算符,不用考虑空间问题,成员函数size() length()都可以取得字符串长度成员函数才c_str()可以返回对应C风格字符串(只读)。
数组:
C风格的数组长度一旦确定就不变了,作为参数传递就锐变成地址无法知道长度只能追加一个参数来表示长度
C++风格的数组用vector<类型>数组名(长度,元素初始值),用法跟数组一样,随时可以调整resize长度,来调整大小,随时可以用成员函数size()来取得元素个数。头文件<vector>