精华内容
下载资源
问答
  • new 运算符,new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有 n 个...

    创建一个对象用什么运算符?对象实体与对象引用有何不同?

    new 运算符,new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)。

    展开全文
  • 在这里我主要对对象以及运算符重载这两章谈谈收获。 1.对象 的数据成员也可以是其他对象的组合),但不能自身的对象作为本的成员,而自身的指针和引用可以作为的成员。 在的定义中...

    由于这一学期刚开始介绍的预备知识(递归、结构体和枚举、string、指针与引用等)已经写在前面的博客里了。在这里我主要对类与对象以及运算符重载这两章谈谈感想、收获。

    1.类与对象

    1. 类的数据成员也可以是其他类的对象(类的组合),但不能类自身的对象作为本类的成员,而类自身的指针和引用可以作为类的成员。

    2. 在类的定义中不能对数据类型进行初始化;类的任何成员都必须指定访问属性。

    3. 在类外:各成员函数的具体实现。

    4. class中括号后的分号“;”不能省略。

    5. public:成员函数(类外使用)
      private:数据成员(类外不能使用,安全)。

    6. 类与结构体的区别:无明确指定时,c++结构体的成员是共有的,而类的成员是私有的。

    7. 成员函数操作的成员:

      • 数据成员
      • 函数内部定义的局部变量
      • (全局变量,封闭性差)
    8. 访问成员函数:
      对象名.共有成员
      对象指针变量名->共有成员

    9. this指针 指向当前对象
      局部变量形参在函数体内,范围小的起作用,范围大的被屏蔽,即形参起作用。

    10. 函数重载:函数名相同,但参数不相同(类型不同或者个数不同)(功能类似)。

    11. 构造函数:
      一定要重载。用于创建对象的特殊函数。创建对象自动调用。

      构造函数公有的。

      作用:为对象分配空间;对数据成员赋初值;请求其他资源。
      用户没定义的话,系统提供缺省版的构造函数。

    12. 析构函数:
      用于取消对象的成员函数。
      作用:
      进行对象消亡的清理工作。
      若用户没有定义,系统提供缺省版本。

    13. 构造函数的初始化列表:

     funnname(参数列表){
       //函数体,可以是空函数体
       } 
    

    数据成员名(形参1)…成员名n(形参n)
    必须使用:
    1.数据成员为常量
    2.数据成员为引用类型
    3.数据成员为没有无参构造函数的类的对象

    1. 构造函数没有返回值,不能有参数,也不能重载。

    2. 浅拷贝:只复制了数据成员没有复制资源。
      简单数据类型,没有问题。
      复杂数据类型,公用形参的资源删掉,对象(作为形参时)出错。没有自身的存储位置,成员值只是一个地址,和复制的是一个人家删了,自己也删了,没有独立的空间。

    3. 常对象:针对类的实例化。
      类名 const 对象名【(参数表)】或者
      const 类名 对象名 【(参数表)】

      常对象只能调用它的常成员函数,静态成员函数,构造成员函数【具有公共访问权限】

    4. 常成员函数:函数说明后加const关键字(简称常函数)对成员函数只读不写

    5. 静态成员(类成员):所有对象公用一个副本
      在定义完类后直接写(初始化)

      不初始化:默认为:
      整数:0
      字符:NULL

    6. 友元:破坏类的封装性,不建议使用。
      这个函数可以是不属于任何类的函数,也可以是其他类的成员函数。

    7. 类的包含(类的组合)

    总结:
    前面简单的梳理了一些基础知识点,当然我没有全部写上,只是写了我认为的比较重要的以及课本上没有的(老师讲的)一些知识点。每一个知识点都比较碎,需要理解并记忆。课本上的基础语法和老师讲的语法需要课后巩固。不足:我感觉目前对于浅拷贝、深拷贝等的应用不够深刻,还需要大量的阅读和实践。这一章是基础,后面还有继承、多态等,所以我要把这些不足之处补上,为后面的学习打下基础。

    2.运算符重载

    1. 返回 对象类型/对象的引用

    2. 运算符函数是一种特殊的成员函数或友元函数。

    3. 一元运算符
      二元运算符

    4. 用成员函数重载运算符:
      返回类型 operate 运算符(形参表);//比正常少一个操作数
      Time operate ++();//前置自增
      Time operate ++(int);//后置自增

    5. 用友元函数重载运算符:
      它的操作数一个不少,操作数类型不相同时,必须使用友元函数。(尽量不使用友元函数重载)

    6. &:形参,复杂类型
      加&:引用
      不加&:临时对象,易销毁。
      返回值没加引用返回一个临时对象,只在函数内,返回后不用了;若加&,常有对象。

    7. c++不能用友元函数重载的运算符:
      - () [] ->

    8. 重载赋值运算符
      只能用成员函数重载。
      已知对象之间赋值,复制构造函数不起作用。

    9. 重载运算符[]和(),只能用成员函数重载,不能用友元函数重载。

    10. 重载流插入和流提取运算符
      只能重载成友元函数
      复杂类型,整体输入和输出
      在重载输入、输出流时可以加入一些判断性的检测。

      总结:
      对于运算符重载,使我感觉眼前一亮。原因就是可以是一些比较复杂符问题简单化,在使用起来非常方便,这是我在java中没有见到的。当然,这一节内容主要就是成员函数、友元函数对运算符重载。其内容主要有对赋值运算符、[]、()、<<、>>等等的重载。其细节也很重要,比如在赋值运算符重载时的深拷贝问题。这里我也只是简要梳理,细节内容我会仔细翻看思考。

    经过这几周的学习,我对面向对象有了进一步的认识,无论是从语法问题还是从认识方面。初始化列表以及运算符重载使我感觉c++很优秀,面对一些问题是处理问题很方便,这是我第一个收获。第二个收获就是老师告诉我们的在写类的时候可以将其分为数据类操作类,这样写比较好,重载运算符时可以把重载运算符函数写到数据类中。第三个收获是在调试的时候,每定义一个类/函数都要在主函数测试(全部功能都有测试),这样在以后写篇幅大的问题减少时间浪费,进而提高效率

    展开全文
  • [本节内容] 赋值运算符重载 5.1 运算符重载 C++为了增加代码的可读性引入运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数...1)不能通过连接其他符号来创建新的操作符:比如 operator@ 2)...

    [本节内容]

    赋值运算符重载
    类的六个默认成员函数在下面博客中讲到:
    类与对象:https://blog.csdn.net/ly_6699/article/details/87870429

    5.1 运算符重载

    C++为了增加代码的可读性引入运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与普通的函数类似。
    函数名字为:关键字operator 后面接需要重载的运算符符号
    函数原型:返回值类型operator操作符(参数列表)
    注意:
    1)不能通过连接其他符号来创建新的操作符:比如 operator@
    2) 重载操作符必须有一个类类型或者联合类型的操作数
    3)用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不能改变其含义
    4)作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参
    5).*、::、sizeof、?:、. 注意以上五个运算符不能重载!!!

    //重载全局 operator==
    //1.公有成员变量,类外实现重载
    class Date
    {
    public:
    	Date(int year = 1900, int month = 1, int day = 1)
    	{
    		_year = year;
    		_month = month;
    		_day = day; 
    	}
    //private:
     //private 限定类外无法访问。 重载全局运算符就要求它们为公有成员所以暂时屏蔽
    	int _year;
    	int _month;
    	int _day;
    };
    bool operator==(const Date& d1, const Date& d2)
    {
    	return d1._year == d2._year&& d1._month == d2._month&&d1._day == d2._day;
    }
    void Test()
    {
    	Date d1(2001, 1, 1);
    	Date d2(2010, 2, 3);
    	cout << (d1 == d2) << endl;    //或 operator==(d1,d2)
    }
    int main()
    {
    	Test();
    	system("pause");
    	return 0;
    }
    

    公有的成员变量方便了重载运算符,但是问题来了,封装性如何保证呢?
    这里我们可以用友元(后面学到)或者干脆重载成成员函数来解决。

    //2.私有成员变量,类内实现重载
    class Date
    {
    public:
    	Date(int year = 1900, int month = 1, int day = 1)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    	bool operator==( const Date &d2)   //第一个操作数默认为this指向的调用函数的对象
    	{
    		return _year == d2._year&&_month == d2._month&&_day == d2._day;
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    void Test()
    {
    	Date d1(2001, 1, 1);
    	Date d2(2010, 2, 3);
    	cout << (d1 == d2) << endl;    //或d1.operator==(d2)
    }
    int main()
    {
    	Test();
    	system("pause");
    	return 0;
    }
    
    5.2赋值运算符重载
    class Date
    {
    public:
    	Date(int year = 1900, int month = 1, int day = 1)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    	Date(const Date& d)
    	{
    		_year = d._year;
    		_month = d._month;
    		_day = d._day;
    	}
    	Date operator=(const Date& d)    //传引用
    	{
    		if (this != &d)      //this是地址
    		{
    			_year = d._year;
    			_month = d._month;
    			_day = d._day;
    		}
    		return *this;     //为实现连续赋值
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    

    赋值运算符主要有以下几点:
    1.参数类型
    2.返回值
    3.检测是否是给自己赋值
    4.返回*this(指针)
    5.一个类如果没有显式定义赋值运算符重载,编译器会生成默认函数,完成对象按字节序的值拷贝

    // 默认赋值重载运算符
    class Date
    {
    public:
    	Date(int year = 1900, int month = 1, int day = 1)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    int main()
    {
    
    	Date d1;
    	Date d2(2019, 1, 2);
    	d1 = d2;   //这里d1会调用编译器生成的operator=完成赋值
    	system("pause");
    	return 0;
    }
    

    那么既然编译器自己生成的赋值重载函数就已经可以完成字节序的值拷贝了,我们还需要自己实现吗?当然向日期类这样的类是没有必要的 ,那么下面的类呢?

    // String 类
    class String
    {
    public:
    	String(const char* str = "jack")
    	{
    		_str = (char*)malloc(strlen(str) + 1);
    		strcpy(_str, str);
    	}
    	~String()
    	{
    		cout << "~String()" << endl;
    		free(_str);
    	}
    private:
    	char* _str;
    };
    int main()
    {
    	String s1("hello");
    	String s2("world");
    	s1 = s2;       //程序在这里会崩溃,因为只有一个空间但要调用两次~String()
    	//这就是浅拷贝容易引发的问题,这时只能用深拷贝解决
    }
    

    **解决方法:**先为新对象开辟一个空间,再进行值拷贝

    class String
    {
    public:
    	String(const char* str = "jack")
    	{
    		_str = (char*)malloc(strlen(str) + 1);
    		
    		strcpy(_str, str);
    	}
    	~String()
    	{
    		cout << "~String()" << endl;
    		free(_str);
    	}
    	String& operator=(const String& s)   //重载赋值运算符
    {
    	if (this != &s)
    	{
    		char* pstr = (char*)malloc(strlen(s._str) + 1);  //再开辟一段空间
    		strcpy(pstr,s._str);
    		delete[]_str;           //手动释放刚开辟的空间
    		_str = pstr;
    	}
    	return *this;
    }
    private:
    	char* _str;
    };
    
    展开全文
  • 1.一个新对象创建,它继承自构造函数的原型,即Fn.prototype 2.将指定的参数传递给构造函数 3.将执行上下文(this)绑定到新创建对象中 4.如果构造函数有返回值,那么这个返回值将取代第一步中新创建对象 ...

    1.一个新对象被创建,它继承自构造函数的原型,即Fn.prototype
    2.将指定的参数传递给构造函数
    3.将执行上下文(this)绑定到新创建的对象中
    4.如果构造函数有返回值,那么这个返回值将取代第一步中新创建的对象

    展开全文
  • 模板是对一批仅仅成员数据类型不同的的抽象,程序员只要为这一批所组成的整个家族创建一个模板,给出一套程序代码,就可以用来生成多种具体的,(这可以看作是模板的实例),从而大大提高编程的效率。...
  • 哪些是需要创建新对象的,哪些又是不需要创建对象的,如果.Java文件中只有一个???????? 三、 java 对象引用为null,出现的bug问题 对于Java中新创建的对象(m)初始化为空,是不能进行属性的调用...
  • //实际上是调用了构造函数中的 Test(200) 创建了一个对象,将对象赋值给t; //如果构造函数中使用explicit作为修饰,不能隐式转化,会杜绝这种情况发生; //上一行的情况则必须 使用: t = (Test) 200; Test ...
  • 3. 设计一个日期Date,包括年、月、日等私有数据成员。...要求:使用运算符重载。 #include<iostream> using namespace std; class Date { public: Date(int y, int m, int d) { ...
  • 【C++】对象(三):运算符重载

    千次阅读 多人点赞 2019-05-15 00:11:41
    【C++】对象(三):运算符重载1. 运算符重载基本概念2. 运算符重载碰上友元函数3. 可重载的运算符4. 自增自减(++/--)运算符重载5. 指针(*,->)运算符重载6. 赋值(=)运算符重载7. 等于和不等于(==,!=)运算符...
  • 运算符重载

    2019-11-23 18:37:19
    运算符重载 运算符重载一种形式的C++多态 1、运算符重载的格式: ...在运算符表示法中,运算符左侧的对象是调用对象运算符右侧的是作为参数被传递的对象。 3、重载限制 至少有一个操作上是用户定...
  • 文章目录一、运算符重载二、复数CComplex三、输出运算符重载 一、运算符重载 运算符重载: 使对象的运算运算表现得和编译器内置类型一样,使同一个运算符可以有不同的功能。即定义一个重载运算符的函数,使指定的...
  • 和对象创建对象的模板,一个可以创建多个对象,每个对象都是类型的一个变量;创建对象的过程也叫的实例化。每个对象都是的一个具体实例(Instance),拥有的成员变量和成员函数。与结构体一样,...
  • 在C++里,有两种方法创建对象: 方法一: ClassName object(param); 这样就声明了一个ClassName类型的object对象,C++会为它分配足够的存放对象所有成员的存储空间。 注意:为节省存储空间,C++创建
  • 【C++语言实现】【本科实验系列】编写程序在CirCle中实现关系运算符(大于,小于,等于),实现按半径对Circle对象排序,自己定义中所需成员。完成上述功能。前言介绍代码总结装逼代码 前言介绍 要求如本文...
  • python内置对象运算符

    千次阅读 2019-06-25 19:38:14
    python内置对象性 整数(int):1、2、3 浮点数(float):5.2、6.66 虚数(complet):3+4j 字符串(str):'ABC'、"666" 列表(list):[1,2,3] 集合(set):{1,2,3} 字典(dict):{1:2,'a':'b'} 元组(tuple)...
  • new创建类对象使用完后需使用delete删除,跟申请内存类似。所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局指针似乎更加高
  • 运算符

    千次阅读 2018-10-04 16:10:33
    (1)一元运算符:只需一个运算对象运算符称为一元运算符。 例: x=-x;//将x值取反赋给x y=++x;//将x值加1赋给y (2)二元运算符:需要两个运算对象的运算符号称为二元运算符。 例: x=x+2; (3)三元运算符:需要...
  • 5. 运算符重载5.1 加号运算符重载5.2 左移运算符重载5.3 递增运算符重载5.4 赋值运算符重载5.5 关系运算符重载5.6 函数...大多数的重载运算符可被定义为普通的非成员函数或者被定义为成员函数。   可重载运算符.
  • 如果使用了 -> 运算符,返回类型必须是指针或者是对象运算符 -> 通常与指针引用运算符 * 结合使用,用于实现"智能指针"的功能。这些指针是行为与正常指针相似的对象,唯一不同的是,当您通过指针访问对象时,...
  • * 左面的对象是右面的类创建对象时,该运算符运算的结果是true,否则是false * * 说明:一个的实例是这个本身的实例,也是他父类,父类的父类的实例,也是实现的接口的实例 * (2)instanceof左边操作元显式声明...
  • 使用运算符
  • C++复数实现运算符重载

    千次阅读 2019-07-03 00:24:15
    4.利用复数实现运算符重载 1.关于运算符重载 运算符重载就是对现有的运算符重新定义,赋予其另一种功能,以实现不同的数据类型。其本质还是函数的重载,使用运算符重载可以使程序更清晰。运算符重载的关键字...
  • 动态分配类对象与静态分配类对象

    千次阅读 2016-09-16 15:21:56
    动态分配类对象:就是使用运算符new来创建一个对象,在堆上分配内存。 静态分配类对象:就是A a,由编译器创建类对象,在栈上分配内存。 1)动态分配类对象的构造函数和析构函数设为protected属性。...
  • 4-1复数运算符重载

    千次阅读 2014-10-03 17:27:17
    4-1 复数运算符重载 Time Limit: 1000MS Memory limit: 65536K ...通过本题目的练习可以掌握成员运算符重载及友元运算符重载 ...要求在主函数中创建对象时初始化对象的值。 输出   输出数据
  • JS创建类对象

    千次阅读 2018-07-08 17:31:34
    JavaScript 创建/对象的几种方式在JS中,创建对象(Create Object)并不完全是我们时常说的创建对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的。JS对象是一种复合类型,它允许...
  • 一、对象移动的概念 C++11新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力。如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非...使用&&来获取右值引用。 这里给...
  • 0. 写作目的 好记性不如烂笔头。 结论:在自定义的中,运算符重载需要返回类对象的引用。如果返回的是类对象,则在赋值的过程中会调用...当运算符重载函数返回的是类对象引用,其过程为,b = c调用运算符重...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 243,721
精华内容 97,488
关键字:

创建类的对象时使用运算符