【本博客中关于C++和QT,无特别说明开发环境为:Visual studio 2013,QT为5.9.9,特此说明,谨慎参考,希望能帮助到爱好者!】
【提醒:c++中关于.和->区别,都是用于成员选择,基于.表示对象名称选择成员,->表示对象指针选择成员。】
c++变量的作用域:如果函数形参跟类的内部的变量重名,在函数内部,c++会仍然使用函数形参如下例子:
#include<iostream>
using namespace std;
class Teacher{
private:
char *tea_name;
int tea_age;
char *tea_address;
public:
void setName(char *tea_name);
void setAge(int tea_age);
Teacher(char *name,int age,char *address);//声明构造函数
void display();//声明普通函数
};
Teacher::Teacher(char *name,int age,char *address){
tea_name=name;
tea_age=age;
tea_address=address;
}
void Teacher::setAge(int tea_age){
tea_age=tea_age;
}
void Teacher::setName(char *tea_name){
tea_name=tea_name;
}
void Teacher::display(){
cout<<"姓名:"<<tea_name<<"\n年龄:"<<tea_age<<"\n地址:"<<tea_address<<endl;
}
int main(){
Teacher tea("张三",34,"北京市海淀区");
tea.setName("李四");
tea.setAge(45);
tea.display();
Teacher *t=new Teacher("黄亮",46,"河南省");
t->setName("周明");
t->setAge(20);
t->display();
return 0;
}
结果是:
姓名:张三
年龄:34
地址:北京市海淀区
姓名:黄亮
年龄:46
地址:河南省
下面调整后:
#include<iostream>
using namespace std;
class Teacher{
private:
char *tea_name;
int tea_age;
char *tea_address;
public:
void setName(char *tea_name);
void setAge(int tea_age);
Teacher(char *name,int age,char *address);//声明构造函数
void display();//声明普通函数
};
Teacher::Teacher(char *name,int age,char *address){
tea_name=name;
tea_age=age;
tea_address=address;
}
void Teacher::setAge(int tea_age){
this->tea_age=tea_age;
}
void Teacher::setName(char *tea_name){
this->tea_name=tea_name;
}
void Teacher::display(){
cout<<"姓名:"<<tea_name<<"\n年龄:"<<tea_age<<"\n地址:"<<tea_address<<endl;
}
int main(){
Teacher tea("张三",34,"北京市海淀区");
tea.setName("李四");
tea.setAge(45);
tea.display();
Teacher *t=new Teacher("黄亮",46,"河南省");
t->setName("周明");
t->setAge(20);
t->display();
return 0;
}
输出结果正确了!
类的外部定义成员函数时必须同时提供类名和函数名。在类的内部定义的成员函数不需要提供类名,成员函数内部调用类定义的变量和类型,无需提供类名。
1、类作用域中,类的非静态成员函数可以直接访问类的其他任何成员。
2、在类作用域外,只能通过类的对象、指针、引用访问类成员,此时类成员转变成了对象成员。
3、类中成员函数定义的局部变量具有程序块作用域,如果有重名,作用域内层的会遮蔽作用域外层的。
4、想要访问重名的作用域相同的函数或变量,可以使用this指针和二元运算符作用域解析符(::)