c++小细节/技巧

一、

printf返回值为整型而不是void,返回值为输出的字符串长度

例如

int a;
a=printf(“123456”);
cout<<endl;
cout<<a;

输出结果为

123456
6

二、

函数中,参数传递依靠栈实现,所以从右到左依次压栈

int a(int b)
{
cout<<b;
return b+1;
}
int aa(int x,int y,int z)
{
cout << endl;
cout << x + y + z << endl;
return 0;
}
int main()
{
int a1=0,a2=0,a3=0;
aa(a1=a(1),a2=a(2),a3=a(3));
return 0;
}

输出结果为

321
9

三、

#define基本上只是简单的字符串替换

所以

#define N 2
#define M N+N
c=M/M

看似c的结果为1,实际上为

c=M/M=N+N/N+N=2+2/2+2=5

四、

返回引用的函数返回的是return后面变量的地址。如果返回局部变量,那么在函数结束调用后,这一块内存会被释放,如果用一个数接住返回值,然后使用,可能会直接报错

int &num(){
    int a=10;
    return a;
}
int main() {
    int b=num();
    cout<<b<<endl;
    return 0;
}

如图,在输出b的地方,有的c++版本会输出10,因为遍历器保留了函数返回值,但此时a所在内存已经释放。有的版本会直接报错或程序中止

如果要正常使用,就要在函数内部,给返回值加上static关键词,使其变为全局变量

五、

接上一条,当使用static使关键词变为全局变量后,函数可以作为左值,即赋值符号左边的值,接受一个返回值,效果是使return后面的变量变为右值。例如:

int &num(){
    static int a=20;
    static int b=10;
    cout<<a<<" "<<b<<endl;
    return b;
}
int main() {
    num()=50;
    num();
    return 0;
}

一开始调用num,输出的是一开始定义的20和10,接着b接受右值,变为50。

那么在第二次调用num函数时,输出结果便为20 50

六、

class中,private和protected的区别主要在于继承时,子类权限的差别。private修饰的成员,只能被父类访问,不可被子类访问,而protected修饰的成员可以被子类访问。

class people{
public:
    people(){
        age=0;
        name="";
    }
private:
    int age;
protected:
    string name;
};
class man:public people{
public:
    void get_info(){
        cout<< this->name<<endl;
        cout<< this->age<<endl;
    }
};

例如这段代码,在this->age这,编译器就会报错,因为在父类people中,age是private属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值