C++学习记录(一)

本文介绍了C++中的类声明和布局,包括公共、保护和私有访问级别。详细讨论了构造函数的使用,展示了如何实现单例模式。同时,提到了常量成员函数的概念,以及友元在类中的作用。此外,还阐述了操作符重载,特别是`+=`运算符的重载示例。
摘要由CSDN通过智能技术生成

类的声明

类的布局

class complea //前置声明

class complex{//class head
	......    //类的声明//class body
};

complex::function(){...}//类的定义

访问级别

共有三个。分别为 public,protected,private
public为公开级别,public公开的数据在任何地方都可以访问。
protected为半公开,只可以在类内和派生出的子类访问。
private为私有,仅可以在类内调用,且private为类内默认的访问级别,及不使用这三个关键字声明的变量默认为private

class complex
{
public:
  complex (double r = 0, double i = 0): re (r), im (i) { }
  complex& operator += (const complex&);
  double real () const { return re; }
  double imag () const { return im; }
private:
  double re, im;

  friend complex& __doapl (complex *, const complex&);
};
//以下为调用
{
	complex c1(2,1);//本例子为错误示范
	cout<<c1.re;//由于re为私有,在类外不可调用故编译器会报错
	cout<<c1.im;
}

{
	complex c1(2,1);//本例子为正确示范
	cout<<c1.real();
	//由于real函数为共有,在类外可以调用,且由于real为类内函数,可以访问private的re和im
	cout<<c1.imag();
}

构造函数

构造函数在创造对象时会自动调用
构造函数名与类名相同如下面例子中的

complex (double r = 0, double i = 0): re (r), im (i) { }
class complex
{
public:
  complex (double r = 0, double i = 0): re (r), im (i) { }
  complex& operator += (const complex&);
  double real () const { return re; }
  double imag () const { return im; }
private:
  double re, im;

  friend complex& __doapl (complex *, const complex&);
};

{
	complex c1(2,1);//创建一个值为2,1和对象
	complex c2;//创建一个无参的对象,由于本类的构造函数在没有传值的情况下有初始值,所以会创建一个值为0,0,的对象
	complex *p=new complex(4);//动态方式创建,new类似于c语言中的malloc
}


构造函数特点:
1.需要和类名相同
2.可以拥有参数,但是没有返回类型
3.参数可以拥有默认值,在没有传参的情况下将默认值赋给对象(任何函数都可以有默认值,析构除外,因为析构不可以加参数)
4,构造函数可以重载(重载:函数名相同,参数列表不同)

构造函数赋值方法

//方法1
 complex (double r = 0, double i = 0): re (r), im (i) { }
//方法2
 complex (double r = 0, double i = 0){ 
		re=r;
		im=i;
 }

方法1为构造函数独有,称为初始列,在函数括号后大括号前的地方,
格式为:被赋值的变量名(将要赋值的值,多数为传入的实参),多个参数由逗号隔开

单例模式

将构造参数放入private区域里,此类不可被外部创建

class A{
public:
	static A& getInstance();
	setup(){...}
private:
	A();
	A(const A& rhs);
};

A& A::getInstance(){
	static A a;
	return a;
}


常量成员函数

在如下位置加入const,常函数内部不会改变任何数据

  double real () const { return re; }
  double imag () const { return im; }

定义常对象时只可以调用常函数

class complex
{
public:
  complex (double r = 0, double i = 0): re (r), im (i) { }
  complex& operator += (const complex&);
  double real (){ return re; }
  double imag (){ return im; }
private:
  double re, im;

  friend complex& __doapl (complex *, const complex&);
};
//以下为示例1
{
	complex c1(2,1);
	cout<<c1.real();
	cout<<c1.imag();
}
//以下为示例2注意,以下两个函数在类内并没有定义为const,由于c1为const,所以调用real函数和imag函数时候会报错
{
	const complex c1(2,1);
	cout<<c1.real();
	cout<<c1.imag();
}

友元

被定义为友元的函数可以无限制访问和该便class内的值,及,类内一切对于友元都是public
相同class的各个对象互为友元

操作符重载

以下例子第三部分定义了两个对象,并且对对象相加,在编译器看来

c2+=c1
相当于
operator += (this,const complex& r)
其中this直指向c2,c1为r,及传进来的实参,但是注意,this为自带的变量,是一个指向调用对象本体的指针,不可在形参列表声明,可以在函数内调用。
//部分一
inline complex&
complex::operator += (const complex& r)
{
  return __doapl (this, r);
}
//部分二
inline complex&
__doapl (complex* ths, const complex& r)
{
  ths->re += r.re;
  ths->im += r.im;
  return *ths;
}
//部分三
{
	complex c1(2,1);
	complex c2(5);
	c2+=c1;
}
 

重载函数在类内定义 格式为

operator 重载的符号(如+={...}
complex::operator += (const complex& r)
{
  return __doapl (this, r);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值