一、
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属性