C++学习笔记(1)

1、引用&

声明:数据类型 & 引用名=变量名
函数调用时不会为形参分配内存空间,节约空间;

int a=10;
int & yinyong=a;//引用必须初始化
void swap(int &a,int &b)
{}

函数可以返回引用类型
返回的相当于是地址,而不是返回对象本身

int &fn(int &num)
{
return num;
}

2、常量const修饰

表示值不能被修改

const int c=10;//常量必须初始化,后期不能修改
const int &b=a;//常量引用  a的值变化b跟着变化
//在类的成员变量中不同的作用
int get_X(void) const;//这个函数只返回x的值,并不修改成员的值

3、函数的默认参数

在函数声明或者定义时可以给参数赋予默认值(有声明时必须在声明上赋予默认值)
如果设置了一个默认值,那么右边的所有参数都必须有默认值

//这是错误的  必须在声明上赋予默认值
int fn(int num);
int main(int argc, char* argv[])
{
    int b=fn();
    cout<<b;
}

int fn(int num=10)
{
    num++;
    return num;
}

4、内联函数

incline 函数返回值类型 函数名(形参列表){函数体}
编译时,类似宏替换,使用函数体替换调用处的函数名。
必须先定义后使用,不然会被认为是普通函数

5、函数重载

6、强制类型转换

int a;
float b=(float)a;//C风格
float b=float(a);//C++风格

4种显示转换方式
static_cast< new_type>(要转换的对象)
只能处理两者间有一定关系的转换

float a=1.9;
float* pf=&a;
int b=static_cast<int>(a);
int* pi=static_cast<int*>(pf);//不能转换

dynamic_cast< new_type>(要转换的对象)
newtype必须是类的指针、类的引用、或者void*
下行转换时会进行安全检查,先尝试转换,如果成功则会返回合法指针,如果失败返回空指针;
还有个要求,类必须是多态,即包括“虚”函数

class Base{virtual void dummy(){}};
class Derived:public Base{};
int main(int argc, char* argv[])
{
    Base* pbb=new Base;
    Base* pba=new Derived;
    Derived* pd;
    pd=dynamic_cast<Derived*>(pbb);//父类转子类,不行,返回void*(空指针)
    pd=dynamic_cast<Derived*>(pba);//子类转子类,没问题
    return 0;
}

const_cast< new_type>(要转换的对象)
用来修改类型的const或volatile属性

const int var = 10;
//int *pi = &var; //不能从const int*转换到int*
int *pi = const_cast<int*>(&var);//这样就能转换了
const int *p_const = &var;//常量指针指向常量指针无问题
*pi = 12;
cout << "var:" << var << endl;//原常量的值并未被修改
cout << "*pi:" << *pi << endl;//但是使用指针调用出来的值却被修改了,有点怪
cout << "*p_const:" << *p_const << endl;//同上
cout << "&var:" << &var << endl;//
cout << "pi:" << pi << endl;//
cout << "p_const:" << p_const << endl;//三个指针均指向同一位置

此方法其实是用在函数参数的传递上

void disp(int *var)
{
    cout << *var << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
    const int var = 10;
    //disp(&var);//不能直接传递
    disp(const_cast<int*>(&var));//实际应用中可能经常出现这种情况,可以传递给函数且不改变原常量
    return 0;
}

reinterpret_cast< new_type>(要转换的对象)
(重新解释)
用作无关类型之间的转换,比如:它可以把一个指针转换成一个整数、把一个整数转换成一个指针、还可以进行不同类型指针之间的转换
随意在不同类型之间使用可能造成程序被破坏

float fa = 1.5;
float *p_fa = &fa;
//int i = reinterpret_cast<int>(fa);  不能转换,不是指针
int *pi = reinterpret_cast<int*>(p_fa);//正确 
int i = reinterpret_cast<int>(p_fa);//正确

7、输入输出流

iostream
cin>>;对应键盘;C stdin
cout<<;对应屏幕;C stdout
cout提供了put输出字符,write输出字符串

char a[] = "abc";
cout << "abc" <<endl;
cout.put('a').put('b').put('\n');
cout.write(a, sizeof(a)-1).put('\n');

数出数据时有时要指定输出格式

控制符作用
dec10进制
hex16进制
oct8进制
setbase(n)设置整数的基数为n(16、10、8之一)
setfill(c)设置填充字符c,c可以是字符串常量或字符变量
setprecision(n)设置实数的精度为n位。一般是指有效位数,当以fixed(固定小数位数)或scientific(指数)形式输出时,n为小数位数
setw(n)设置字段宽度为n位
setiosflags(ios::fixed)固定小数位输出
setiosflags(ios::scientific)科学计数法输出
setiosflags(ios::left(or right))输出数据左对齐
setiosflags(ios::shipws)忽略前导空格
setiosflags(ios::uppercase)科学计数法输出E和16进制输出X时,大写表示
setiosflags(ios::showpos)输出正数给出+号
resetiosflags终止已设置的格式状态,在括号中指定内容

cin>>从流中提取数据时,通常忽略其中的空格、换行和Tab等

char ch,ch2;
    ch= cin.get();
    cout << ch << endl;
    cin.sync();//因为接下来的代码要从流中读入数据,而上一步以回车结尾,所以一定要清除缓存,否则会读入回车
    cin.get(ch2);//2种读取单个字符的方法
    putchar(ch2);//显示字符
    cin.sync();
    char buffer[10];
    cin>>buffer;//cin.read(buffer,10);
    cout.write(buffer,sizeof(buffer)-1);//如果输入的字符少于10个后面会有乱码
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值