类
struct A {
int show() const { // 定义在类内的函数是内联的;const表示函数不能改变类的成员,a不能修改;
return a;
}
A& combine(const A&); // 函数声明必须在类内,定义可以在类外;
int a=1; // 成员变量,最好初始化,或者指定构造函数,默认初始化不同的编译器会产生不同的结果;
int b=2;
};
A& A::combine(const A& c) { // 类外的成员函数定义,必须加A::修饰,默认形参传入this,一个指向当前对象的指针
this->a+=c.a; // this是默认传入的,可以直接用
b+=c.b; // 由于是成员函数,所以可以访问b
return *this; // 返回*this即该对象,函数返回值是对该对象的引用;如果是show()const这种const成员函数,
默认传入的是const A * const this所以不能改变*this,const的对象、对象的引用、对象的指针,均只能使用带const的
常量成员函数
}
int main() {
A a; // struct A a是等同的,直接用A a即可
A b = a.combine(a);
cout<<b.a<<endl;
const A c;
c.combine(a); // 错误,const对象c只能使用常量成员函数
int d = c.show(); // 正确,show是常量成员函数
return 0;
}
类内没有构造函数声明时,使用默认构造函数,参数默认构造,但是有些指针 数组复杂变量无法默认构造,会出错,尽量显式构造
struct B {
B() = default; // 表示B()定义了一个默认构造函数
B(){} // 定义了空的构造函数,和上面等同
B(int in1,int in2):a(in1),b(++in2),c(0){} // 定义了构造函数,{}中为空因为没有需要执行的语句
B(int); // 声明了构造函数,并未定义,在类外定义
int a;
int b;
int c;
}
B::B(int aaa){a=aaa;} // 类外定义构造函数,所有构造函数无返回值,函数名与类名相同
class C { // class与struct唯一区别是,class默认为private,struct默认为public
friend void function(int); // 声明function是友元,可以使用private变量,友元的声明位置可以在类内任意位置
public:
private:
int a;
};
void function(int); // 类外也要声明该函数,类内的友元声明是额外的
void function(int a) {
C c;
c.a=a; // 友元可以访问private
cout<<c.a<<endl;
}
main() {
int a=10;
function(a); // 10
return 0;
}