博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
复制构造函数
阅读量:6364 次
发布时间:2019-06-23

本文共 3445 字,大约阅读时间需要 11 分钟。

主要是想说复制构造函数的,但是偏偏问题就来了。所以还介绍了

passing 'const Student' as 'this' argument of 'int Student::getId()' discards qualifiers [-fpermissive]

error:passing ‘const LineList<int>’ as ‘this’ argument of ‘void LineList<T>::Out(ostream&) [with T = int]’ discards qualifiers  

这个问题。

 

解决方案:来自博客:

写的十分靠谱。

原文问题:

error:passing ‘const LineList<int>’ as ‘this’ argument of ‘void LineList<T>::Out(ostream&) [with T = int]’ discards qualifiers  

“意思是说  在一个加了const限定符的成员函数中,不能够调用 非const成员函数。

因为如果调用了非const成员函数,就违反了const成员函数不改变对象的规定。

error...discards qualifiers 的意思就是缺少限定符

因此,他的解决办法很简单了 ,只要将checkElements()函数申明改为  checkElements()const就行了

—— 

换成自己的话再说一遍就是:

我们在拷贝构造函数中使用了(const student &st)一个student的对象,并且他是const的。所以要求对于在使用过程里面的st所要调用的函数也必须是const的。 

举例: 

正常情况下: 

student.h 中: 

int getId(void); 

student.cpp中: 

int student::getId(void){ 

return this->id; 

}

 

拷贝构造函数中: 

student::student(student &st){ 

this->id = st.getId(); 

}

 

上面这一套写法通过。 

 

修改: 

拷贝构造函数中:原来的st中的内容必然不能变化所以: 

student::student(const student &st){ 

this->id = st.getId(); 

//这样在QT中就会报discards qualifiers [-fpermissive]错误。 

解决方式: 

student.h 中: 

int getId(void)const; 

student.cpp中:

int student::getId(void)const{

return this->id;

}

这是这里面一个cosnt的用法,比起C语言来讲又多了一个点,就像extern一样有双重含义。

关于深浅拷贝:

vs中实现的,因为在QT里面忘记了字符串复制的时候忘记进行初始化了,总之同样的代码貌似对于我来说,vs更好上手。QT有点儿看不懂它提示的错误。但是QT里面的“.”能自动帮我们解析。总之各有利弊吧。

下面是复制构造函数的例程:

student.h

#pragma onceclass student{private:    int id;    char *name;public:    student();    int getId(void) const ;    void setId(int id);    char *getName(void) const;    void setName(const char *name);    student(const student &st);    ~student();};

main.c

#include 
#include "student.h"using namespace std;int main(){ student *s1 = new student; s1->setId(1); s1->setName("lifei"); cout << s1->getId() << endl; cout << s1->getName() << endl; student *s2 = new student; s2 = s1;//浅拷贝 cout << "s1's id is " << s1->getId() << " name is " << s1->getName() << endl; cout << "s2's id is " << s2->getId() << " name is " << s2->getName() << endl; s1->setName("letben"); cout << "s1's id is " << s1->getId() << " name is " << s1->getName() << endl; cout << "s2's id is " << s2->getId() << " name is " << s2->getName() << endl; student *s3 = new student(*s1);//深拷贝 s1->setName("qingwa"); cout << "s1's id is " << s1->getId() << " name is " << s1->getName() << endl; cout << "s3's id is " << s3->getId() << " name is " << s3->getName() << endl; system("pause"); return 0;}

student.cpp

#include "student.h"#include 
#include
#pragma warning(disable:4996)student::student(){}student::~student(){ //func1: /* if (this->name != NULL){ free(this->name); }*/ //func2: if (this->name != NULL){ delete []this->name; }}int student::getId(void) const { return this->id;}void student::setId(int id){ this->id = id;}char *student::getName(void)const { return this->name;}void student::setName(const char *name){ //std::cout << strlen(name) << std::endl; //这个不能完善!!!写这写着又变回C了。得赶紧到stl我猜。复制 再malloc是嘛。。。假装写一下吧 //func1: //this->name = (char *)malloc(strlen(name) + 1);//感觉还是vs好一点儿,最起码知道哪里出了错误 //strcpy(this->name, name); //func2: this->name = new char[strlen(name) + 1]; strcpy(this->name, name);}student::student(const student &st){ this->id = st.getId();//为了这句话可以通过 引用代表的当前对象调用的函数上需要加上const。 this->setName(st.getName());}

运行结果:

转载于:https://www.cnblogs.com/letben/p/5292946.html

你可能感兴趣的文章
[javaSE] 单例设计模式
查看>>
Unity-Animator深入系列---状态机面板深入
查看>>
第16章 GTK+ gnome编程
查看>>
2016/04/17
查看>>
关于web服务接口测试的一些问题及答案
查看>>
java各种集合的线程安全
查看>>
having 子句
查看>>
读写文本(.txt)文件 .NET
查看>>
添物不花钱学JavaEE(基础篇)- Java
查看>>
我的云之旅--hadoop集群集成Hbase集群(5)
查看>>
Unity3D插件之Easy Touch 3.1(1): Easy Joystick
查看>>
解决问题:Android设备运行自动化脚本报错 ioerror RPC server not started
查看>>
自己写一个jquery
查看>>
Zookeeper集群安装(CentOS 7环境下)
查看>>
四则运算3
查看>>
JavaScript Boolean( new Boolean(false) ) 其实是true
查看>>
C#使用Process调用批处理阻塞问题
查看>>
检查网络连接状态。
查看>>
Android Animations动画使用详解
查看>>
打乱图片顺序,按一定比例分别存放
查看>>