C++结构体如何定义构造函数??

问题:在网上看到别人写的c++定义构造函数的代码如下:

struct Gnode{
    int label;    //
    vector<Gnode *> nbs;
    Gnode(int x): label(x) {}    //构造函数  ?  
};



请问,这个第3行构造函数为什么可以这样写,为何label(x)可以写在大括号的前面?


不是应该写成:


struct Gnode{
    int label;    //
    vector<Gnode *> nbs;
    Gnode(int x){
        label=x; 
    }    

};

这种形式吗?


对C++结构体部分不太熟悉,求大佬解释一下?




另外我如果想补充一下自己的这些知识,有啥推荐的书吗? 重新学一遍大一时候学的C++课本??

2个回答

书籍:C++ primer
这种形式的构造函数是创建的时候初始化,然后再调用构造函数。
也就是说变量label的赋值完成后,才会执行构造函数里面的语句。
C++结构体和类相似,有部分不同。具体的看书就明白了。

这种写法叫初始化列表,跟c++类一样。label(x) 这个对label 初始化是发生在构造函数之前。意思是构造函数还没开始就先对label赋值了。
然而:

    Gnode(int x){
        label=x; 
    }  

这种是赋值操作,是进入构造函数之后才对label赋值的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++结构体如何定义构造函数??
**问题:**在网上看到别人写的c++定义构造函数的代码如下: <br /> ``` struct Gnode{ int label; // vector<Gnode *> nbs; Gnode(int x): label(x) {} //构造函数 ? }; ``` <br /> 请问,这个第3行构造函数为什么可以这样写,为何label(x)可以写在大括号的前面? <br /> 不是应该写成: ``` struct Gnode{ int label; // vector<Gnode *> nbs; Gnode(int x){ label=x; } }; ``` 这种形式吗? <br /> **对C++结构体部分不太熟悉,求大佬解释一下?** <br /> <br /> 另外我如果想补充一下自己的这些知识,有啥推荐的书吗? 重新学一遍大一时候学的C++课本??
C++结构体里构造函数地址怎么获得?
``` struct A { union { char szBuffer[9]; struct { char ch; float fl; int i; }Value; }Data; A () { Data.Value.ch=1; Data.Value.fl=3.14; Data.Value.i=2; } }; ``` A a1; 想打印出a1里A ()函数的地址 怎么实现??请高手指导一下
c++声明结构体指针变量提示没有构造函数错误
##在OJ中做题 ###题目描述 输入一个链表,从尾到头打印链表每个节点的值。 ----- 我的代码: ```c // struct ListNode { // int val; // struct ListNode *next; // ListNode(int x) : // val(x), next(NULL) { // } // }; class Solution { public: vector<int> printListFromTailToHead(struct ListNode* head) { struct ListNode* p1, p2; p1 = head; p1->next = NULL; p2 = p1->next, p2->next = p1; p1 = p2; while(p1->next != NULL) { p2 = p1->next; p2->next = p1; p1 = p2; } //现在p1指向新链表头 vector<int> out; int i = 0; while(p1 != NULL) { out[i++] = p1->val; p1 = p1->next; } } }; ``` 我想先反转链表再顺序输出,可是结构体变量声明那一行提示没有构造函数错误(去掉结构体定义的注释号提示结构体重复定义,所以我认为结构体在后台已经定义过了) 错误信息: 编译错误:您提交的代码无法完成编译 In file included from main.cc:2: ./solution.h:13:30: error: no matching constructor for initialization of 'struct ListNode' struct ListNode* p1, p2; ^ ../../include/tools.h:115:2: note: candidate constructor not viable: requires single argument 'x', but no arguments were provided ListNode(int x) : ^ ../../include/tools.h:112:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided struct ListNode { ^ ../../include/tools.h:112:8: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 0 were provided 1 error generated. 提交运行
c++结构的构造函数
有下面两个C++结构: struct Vertex3D{ GLfloat x; GLfloat y; GLfloat z; Vertex3D(GLfloat a, GLfloat b, GLfloat c){ x = a; y = b; z = c; } }; struct Triangle3D{ Vertex3D v1; Vertex3D v2; Vertex3D v3; Triangle3D(Vertex3D vt1, Vertex3D vt2, Vertex3D vt3){ }; }; `Vertex3D`的构造函数正常,`Triangle3D`的构造出现警告:```“Constructor for 'Triangle3D'' must explicitly initialise member 'v2' which does not have default constructor”``` 但是我已经为`Vertex3D`类型结构创建了一构造函数,为什么还会出现这类错误呢?应该怎么解决?谢谢
急!急!急! C++ 结构体带构造函数的在C#中改如何定义
struct THFI_Param { int nMinFaceSize; int nRollAngle; bool bOnlyDetect; DWORD dwReserved; THFI_Param() { nMinFaceSize=50; nRollAngle=30; bOnlyDetect=false; dwReserved=NULL; } };
关于C++中结构体的构造函数中带冒号的问题
``` struct Matrix { int a, b; Matrix(int a = 0,int b=0) : a(a),b(b) { } } m[26]; ``` 构造函数中是对里面的成员变量设置默认值,那为什么在上述代码中已经初始化之后还要再加冒号呢? 另外有冒号的这一行是什么意思。新手小白一个,请大神指教,非常感谢
调用哪个构造函数?C++,结构体
``` struct LinkNode { T data; //数据域 LinkNode<T>*link; //链指针域 LinkNode(LinkNode<T> *ptr =NULL) {link=ptr;} LinkNode(const T&item,LinkNode<T> *ptr=NULL) { data=item; link=ptr; } }; ``` 如果有下面代码 T value; LinkNode<T> *desptr=first=new LinkNode<T>; desptr->link=new LinkNode<T>(value); 它调用的是LinkNode的哪个构造函数?为什么呢?
关于复制构造函数跟赋值运算符重载
新手求指导 关于两个函数不太理解 复制构造的是同一个内存地址吗 为什么要重载赋值运算符
C++课程设计 求大神帮忙写下构造函数和析构函数
1.网格世界类 网格中每个元素存放各种生物对象的指针或者为空。模拟过程中,我们需要移动生物,还有繁殖和饥饿(死亡),所以在网格类中,我们可以将一只生物放到网格中;可以读取网格中的某个指定位置的生物,获取它的指针,以便在每一个time step中对它进行处理(移动、繁殖和饥饿死亡)。在一个time step中,网格中每只生物都要处理一遍,先狮蚁,后蚂蚁。另外,应该有一个显示网格的成员函数。 2.有机生物类 生物要能够放到网格中,所以每一只生物都有相关的函数。可以是构造函数,即构造生物的时候,同时指明放到网格的哪一个位置上。 有Move函数,Breed函数,Starve函数(是否饿死)。这些函数在派生类中有派生类自己的实现。所以,在有机生物类中,这些函数应该是纯虚函数,有机生物类是一个抽象类。 网格世界类中,从某个网格位置读取生物并处理时,需要知道是哪一种类型的生物(是狮蚁还是蚂蚁),所以,有机生物类里应该考虑如何返回生物的类型。简单的办法是,用不同的常量来表示狮蚁和蚂蚁。例如,用整数1表示狮蚁,2表示蚂蚁。在有机生物类中定义纯虚函数GetType,返回生物的具体类型。 3.蚂蚁类 实现Move函数,Breed函数,Starve函数和GetType函数。 4.狮蚁类 实现Move函数,Breed函数,Starve函数和GetType函数。 (二)细化: 1.网格世界类: (1)属性。数据结构:网格世界中如何存放蚂蚁或狮蚁对象? 20*20的网格,用一个20*20的二维数组来表示,数组元素是什么类型? (2)方法。网格世界类应该有哪些成员函数? 构造函数:初始化网格。 析构函数:释放掉所有生物。 Set函数:指定x,y位置(二维数组的下标),以及一只生物的地址(指针),将这只生物存入网格中。 Get函数:获取网格中x,y坐标上的生物的地址(指针)。 OneStep函数:在一个time step中,网格中每只生物都要处理一遍,包括移动、繁殖和饥饿。首先,把网格中的每一只生物在本轮是否移动过的标记moved先都标记为假(为什么?);其次,移动,先狮蚁,后蚂蚁,同时把该生物的moved标记为真;再次,把饥饿的狮蚁消灭掉;最后,繁殖。 Display函数:显示函数,显示网格中的具体情况。每个网格,如果是空,显示”.”;如果是蚂蚁,显示”o”;如果是狮蚁,显示”x”。 2.有机生物类 (1)属性 要记录每只生物的一些基本属性:属于哪个网格对象,具体在哪个位置上(x,y坐标),本轮是否移动过。另外,为了记录是否到了繁殖时间,要有一个跟踪器,即记录上次繁殖之后,又经历了多少次time step。 (2)方法 构造函数: 带参数的构造函数:指定网格对象和x、y位置,把构造的生物放到网格中。 析构函数: Move函数,Breed函数,Starve函数和GetType函数为纯虚函数。 3.蚂蚁类 (1)属性 不需要再添加属性。 (2)方法 构造函数: 带参数的构造函数:指定网格对象和x、y位置,把构造的蚂蚁放到网格中。 析构函数: Move函数:随机选择一个方向,看是否能移动,否则保持在原位置。 Breed函数:繁殖跟踪器+1.如果是3的倍数,就需要繁殖,同时跟踪器清零。 Starve函数:本模拟中蚂蚁不会饿死,所以仅返回false值即可。 GetType函数:返回蚂蚁的类型标记。 4.狮蚁类 (1)属性 狮蚁会饿死,需要添加一个属性,跟踪记录狮蚁饥饿了多少次time step。 (2)方法 构造函数: 带参数的构造函数:指定网格对象和x、y位置,把构造的狮蚁放到网格中。 析构函数: Move函数:若有相邻蚂蚁,移动到单元网格,吃掉蚂蚁;否则,随机选择一个方向,看是否能移动,不能移动则保持在原位置。 Breed函数:繁殖跟踪器+1,如果是8的倍数,就需要繁殖,同时跟踪器清零。 Starve函数:饥饿跟踪器+1,如果是3的倍数,则饥饿并死亡,从网格中拿掉该狮蚁,同时跟踪器清零。 GetType函数:返回狮蚁的类型标记。 四、其它 (一)所有涉及的常量定义为类型常量。如: const int ANTBREED = 3; //蚂蚁的繁殖周期为3个time steps const int DOODLEBREED = 8; //狮蚁的繁殖周期为8个time steps 初始化网格世界时,用的狮蚁只数和蚂蚁只数,分别为5只和100只,也定义为类型常量。如: const int INITIALANTS = 100; const int INITIALBUGS = 5;
C++超大整数结构体实现乘法,就像要个乘法,网上的看不懂,希望来回答的能多写点注释或者给我讲讲!菜鸟求大佬
``` #include <stdio.h> #include <iostream> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; //我们把输入的两个操作数放在结构体中方便解决 //首先,为了方便后面运算,我们先定义一个结构体把超长整数都定义为此类型 struct doublelong{ int d[1000]; //定义一维数组D int len; //下面定义构造函数,初始化,给予长度 doublelong(){ memset(d,0,sizeof(d)); //memset为初始化函数 数组d sizeof求出的d大小赋予空间 指向要填充的内存块d //d用于存放 输入的两个操作数 //全初始化为0 len=0; } }; //大整数使用字符串输入的, //下面将字符串储存的大整数 //存放在结构体中 doublelong change(char str[]){ doublelong a; a.len=strlen(str);//得出输入的大整数长度写入结构体中 for(int i=0;i<a.len;i++){ a.d[i]=str[a.len-i-1]-'0';//这里把大整数的地位切换为高位 反序 } return a; } //比较两个大整数的大小 int compare(doublelong a,doublelong b){ int g; //greater此处返回更大数字 g的值为1时a的值更大,2时b的值更大,为0时两个数字的值相等 //由于我们此函数只比较两个输入数字的绝对值,由于运算方式是单独判断符号所以不对符号进行比较 if(a.len>b.len){ g=1;return g;//a大于b } else if(a.len<b.len){ g=2; return g;//a<b } else{ for(int i=a.len-1;i>=0;i++) //一位位对比一位位读取向后读 { if(a.d[i]>b.d[i]) { g=1;return g; } if(a.d[i]<b.d[i]) { g=2;return g; } if(a.d[i]=b.d[i]) { g=0;return g; } } } } //下面是大数的四则运算法则 doublelong add(doublelong a,doublelong b) { doublelong c; int carry=0;//这里的carry表示进位 for(int i=0;i<a.len||i<b.len;i++) //循环向后读取相加 { int temp=a.d[i]+b.d[i]+carry; c.d[c.len++]=temp%10; //将我们相加得到的temp值给写入我们的输出大整数c中去 carry=temp/10;//求是否有进位 } if(carry!=0) {//如果最后一位的进位不为0,直接付给结果的最高位 c.d[c.len++] =carry; } return c;//程序结束返回doublelong c } void print(doublelong a) { for(int i=a.len-1;i>=0;i--) { printf("%d",a.d[i]); } } ```
数据结构的疑问:不存在从 "int" 转换到 "People" 的适当构造函数?
``` #include<stdio.h> #include<iostream> #define MaxWindow 30 #define MaxProc 1 #define error 0 using namespace std; typedef struct People ElementType; struct People { int T; int P; }; typedef int Position; struct QNode { ElementType *Data; Position Front, Rear; int MaxSize; }; typedef struct QNode *Queue; Queue CreatQueue(int MaxSize) { Queue Q = (Queue)malloc(sizeof(struct QNode)); Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType)); Q->Front = Q->Rear = 0; Q->MaxSize = MaxSize; return Q; } bool IsFull(Queue Q) { return((Q->Rear + 1) % Q->MaxSize == Q->Front); } bool AddQ(Queue Q, ElementType X) { if (IsFull(Q)) { printf("队列满\n"); return false; } else { Q->Rear = (Q->Rear + 1) % Q->MaxSize; Q->Data[Q->Rear] = X; return true; } } bool IsEmpty(Queue Q) { return(Q->Front == Q->Rear); } ElementType DeleteQ(Queue Q) { if (IsEmpty(Q)) { printf("队列空\n"); return 0; } else { Q->Front = (Q->Front + 1) % Q->MaxSize; return Q->Data[Q->Front]; } } void DestroyQueue(Queue Q) { free(Q); } double QueueingAtBank(Queue Q, int N) { struct People Next; int k; int TotalTime; int CurrentTime; int Window[MaxWindow]; int WaitTime; int WinAvail; int i, j; scanf("%d", &k); for (i = 0; i < k; i++) Window[i] = 0; TotalTime = 0; while (!IsEmpty) { WinAvail = FindNextWindow(Window, k, &WaitTime); CurrentTime += WaitTime; Next = DeleteQ(Q); if (CurrentTime >= Next.T) TotalTime += (CurrentTime - Next.T); else { WaitTime = Next.T - CurrentTime; for (j = 0; j < k; j++) { Window[j] -= WaitTime; if (Window[j] < 0) Window[j] = 0; } CurrentTime = Next.T; } Window[WinAvail] = Next.P; } return((double)TotalTime / (double)N); } int FindNextWindow(int W[], int k, int *WaitTime) { int WinAvail; int MinW = MaxProc + 1; int i; for (i = 0; i < k; i++) if (W[i] < MinW) { MinW = W[i]; WinAvail = i; } *WaitTime = MinW; for (i = 0; i < k; i++) W[i] -= MinW; return WinAvail; } int main() { int N; Queue Q; int i; ElementType X; scanf("%d", &N); Q = CreatQueue(N); for (i = 0; i < N; i++) { scanf("%d %d", &X.T, &X.P); AddQ(Q, X); } printf("Average waiting time = %.lf minute(s).\n", QueueingAtBank(Q, N)); DestroyQueue(Q); return 0; } ``` 1 IntelliSense: 不存在从 "int" 转换到 "People" 的适当构造函数 请问各位大佬我这串代码的报错是为什么呀
c++数据结构里面一直有无法解析,该函数在main函数里面被引用,该怎么解决,代码如下
错误如下 错误 LNK1120 8 个无法解析的外部命令 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\Debug\ConsoleApplication2.exe 1 错误 LNK2019 无法解析的外部符号 "public: bool __thiscall CriList<int>::empty(void)" (?empty@?$CriList@H@@QAE_NXZ),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: class Node<int> * __thiscall CriList<int>::insert(int,int)" (?insert@?$CriList@H@@QAEPAV?$Node@H@@HH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: class Node<int> * __thiscall CriList<int>::search(int)" (?search@?$CriList@H@@QAEPAV?$Node@H@@H@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: void __thiscall CriList<int>::set(int,int)" (?set@?$CriList@H@@QAEXHH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: __thiscall CriList<int>::CriList<int>(int * const,int)" (??0?$CriList@H@@QAE@QAHH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: int __thiscall CriList<int>::count(void)" (?count@?$CriList@H@@QAEHXZ),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: int __thiscall CriList<int>::get(int)" (?get@?$CriList@H@@QAEHH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 #include"head.h" int main() { Node<int>node(5); int values[9] = { 1,2,3,4,5,7,8,9 }; CriList<int> cl(values, 9); if (cl.empty()) { cout << "不为空" << endl; } else { cout << "空" << endl; } cout << "长度为:" << cl.count() << endl; cout << "在3号位置的是" << cl.get(3) << endl; cout << "把5号位置的数据替换为10" << endl; cl.set(5, 10); cout << "把5号位置插入为12" << endl; cl.insert(5, 12); cl.removeAll(); cout << "查找数据为11的数" << endl; cl.search(11); return 0; } //fun。cpp #include"head.h" template <class T> CriList<T>::CriList()//创建一个空表 { this->head = new Node<T>(); this->head->next = this->head; } template<class T> CriList<T>::CriList(T values[], int n) { int i = 0; head = new Node<T>(); Node<T>*p = head; while (i < n) { Node<T>*q = new Node<T>(); q->data = values[i]; q->next=NULL; p->next = q; p = q; } p->next = head; printf(); } template <class T> bool CriList<T>::empty() { return this->head->next = this->head; } template <class T> int CriList<T>::count() { int i = 0; Node<T>*q = head; while (q->next != head) { i++; } return i; } template <class T> T CriList<T>::get(int i) { int j; Node<T>*p = head; for(j=0;j<i&&p->next!=head;j++) { p = p->next; } if (j == i) { return this->head->data; } } template <class T> void CriList<T>::set(int i, T x) { int j; Node<T>*p = this->head; for (j = 0; j<i&&p->next!=head;j++) { p = p->next; } if (j == i) { p->data = x; } printf(); } template <class T> void CriList<T>::printf() { Node<T>*p = this->head; while (p->next! = head) { cout << p->data << '\t'; } } template<class T> Node<T>* CriList<T>::insert(int i, T x) { int j; Node<T>*p = this->head; for (j = 0; j<i&&p->next != head; j++) { p = p->next; } if (j == i) { Node<T>*q = new Node<T>(); q->data = x; q->next = p->next; p->next = q; } } template<class T> void CriList<T>::removeAll() { Node<T>*q = head; while (q->next != head) { Node<T>*p = new Node<T>(); p = q->next; delete p; p = p->next; } } template<class T> Node<T>*CriList<T>::search(T key) { Node<T>*q = head; while (q->next!= head) { q = q->next; if (q->data == key) { cout << "查找正确" <<endl; } } if (q->next == head) { cout << "查找失败" << endl; } } //head.h #include<iostream> using namespace std; template <class T> class Node { public: T data; Node<T>*next;//指针域分别指向后继结点。 Node()//构造结点,data域未初始化无参构造函数 { this->next = NULL; } Node(T data, Node<T>*next = NULL)//有参构造函数,后继结点默认值为空 { this->data = data; this->next = next; } }; template <class T> class CriList { public: Node<T>*head;//头指针 CriList();//构造空表 CriList(T values[], int n); bool empty();//判断是否为空表 int count();//返回链表的长度 T get(int i);//返回第i个元素 void set(int i, T x);//设置第i个元素为X,虚函数 void printf();//输出循环链表 Node<T>*insert(int i, T x);//插入x作为第i个元素 void removeAll();//清空循环链表 Node<T>*search(T key);//查找关键字位key的元素 };
C++ 在类里面实现链表的合并
我创建了一个类,里面包含链表的输入、输出、排序、打印、合并等等功能。然后我用类定义了两个变量,但是实现他们合并的时候懵了,这个函数应该要获取两个链表的头结点,我就不知道该怎么获取了,因为头结点是私有在类中的,求帮助!!! ![图片说明](https://img-ask.csdn.net/upload/201704/17/1492359556_374242.png) ![图片说明](https://img-ask.csdn.net/upload/201704/17/1492359570_898892.png) 主函数里面只输入了链表的长度,第二张图是结构体跟类的构造函数那部分
c++关于实现分组密码,轮函数要用到线返
基于feistel结构构造一个分组密码算法。要求: 1.分组长度=128bit 2.主密钥长度>=128bit 3.轮数=16 4.轮函数的设计要用到LFSR
问个关于jNI返回结构体的问题,请教一下a
如果要返回两个值则 [code=C/C++][/code]JNIEXPORT jobject JNICALL Java_com_sundy_jnidemo_CMFJ_getStruct (JNIEnv *env, jobject obj) { //获取Java中的实例类 jclass objectClass = (*env)-> FindClass(env,"com/sundy/jnidemo/DiskInfo"); //获取Java中的构造函数 jmethodID init = (*env)->GetMethodID(env, objectClass , "<init>", "(Ljava/lang/String;I)V"); //调用构造函数创建对象,写入名字和序列号 jobject newObj = (*env)->NewObject(env, objectClass, init, (*env)->NewStringUTF(env, "my name is D:"), 10); //返回创建的对象 return newObj; } 那如果要返回四个则怎么写呢,我总是不出结果
关于散列表中除留余数法构造的散列函数,除数选择素数的疑问
正在学习数据结构里的散列相关知识,书里一般都会提到,如果用除留余数的散列函数,最好选择素数作为除数。但没有对此详细的证明。 对此不太理解,个人理解是,无论素数还是合数,在取模的一个周期内都是均匀分布的单射的,并不会因为除数有质因数改变分布和冲突情况。 看了一些其他文章,也没有具有普遍性的证明。有的文章中会用一个特例来说明素数作除数更好,但特例不能证明一般性(例如有的文章中会拿一个具有公因数3的数列为key,然后mod6,结果表明这些key都被散列在0、3、6的地址上,以此来说明除数不应该用合数。但这个观点显然站不住脚,因为我也可以举一个具有公因数7的序列为key来mod7,也会造成严重冲突,而7是素数) 对于平常的应用中,如果散列的key通常不具有普遍的规律(例如都是某个数的倍数)而更倾向于随机性(比如储存一些号码,没有特殊规律),在这种随机输入的情况下是不是除数是否是素数不影响散列产生冲突的情况?如果依然有影响,能否有详细的具有普适性的证明 本人才疏学浅,想不通这个问题,特来请教
谁能帮我解决一个简单程序
1、多个类的继承关系画出结构图(五个以上类) 2、定义五个以上类 ,每个类写出类的定义(2个文件) 3、使用静态数据成员和静态成员函数 4、要求有基类和派生类的构造函数 和至少一个析构函数) 5运算符重载 成员函数或友元函数 6、实现多重继承和虚基类 7、使用抽象类,实现多态性 8、主函数
数据结构C++写一个表达式二叉树
如何声明一个Operators运算符集合类,提供运算符及其优先级,按优先级比较运算符大小的函数,两个操作数进行指定运算的函数等 还有如何将一个表达式以前缀表达式构造,用递归算法
新手问,C++类方法中不能创建别的结构的变量吗?
初学c++,想综合练习一下结构和类。 我定义了 1:一个Formula类,主要用于保存某种公式; 2:一个Fml_LNode结构,包含Formula对象和Fml_LNode指针,用于将Formula对象存储为单链表形式; 3:一个Fml_LList类,包含上述链表的结点数、头指针和尾指针,以及成员函数add()。如代码所示。 ``` class Formula { private: gem src; gem pro; public: Formula(gem sc, gem pr); ~Formula() {}; void show(); }; struct Fml_LNode { Formula fml; Fml_LNode *next; }; class Fml_LList { private: int num_of_formulas; Fml_LNode *L; Fml_LNode *rear; public: void add(Formula & fml); }; ``` add()方法的功能是接受一个Formula公式对象的引用,尾插法加入到链表中,代码为: ``` void Fml_LList::add(Formula & newfml) { num_of_formulas++; int a; rear = new Fml_LNode; rear->fml = newfml; rear->next = NULL; rear = rear->next; } ``` 遇到问题: 在新建链表结点那一行,编译器提示不能”尝试引用已删除的函数“。 ![图片说明](https://img-ask.csdn.net/upload/201901/13/1547378030_779619.png) ![图片说明](https://img-ask.csdn.net/upload/201901/13/1547378141_738901.png) 我明明是用结构体变量,这和构造函数啥的又有什么关系呢?如果不能则么做,希望能提供一个思路谢谢大家
内部排序的性能分析:函数调用的问题?在主函数中用一种方法排序后,排好序的顺序表被带回主函数,再用另一种方法排序等于没用了
原先用的void insertsort(Sqlist &L),改成void insertsort(Sqlist L)还是不行,形参不是传值调用主函数不会改变嚒? 已经测试排序的代码没有问题,单独使用一种方法没有问题,几种同时使用才会出问题, ![图片说明](https://img-ask.csdn.net/upload/201912/09/1575891779_129272.png) 第一行:随机生成的顺序表 第二行:Insert排序后的顺序表 第三行:比较次数,移动次数 第四行:Shell排序前的顺序表 第五行:Shell排序后的顺序表 可以看出shell根本不需要排序,移动次数为0...... 代码太长截取一部分有用的: ``` #define _CRT_SECURE_NO_DEPRECATE #include<stdio.h> #include<stdlib.h> #include<time.h> typedef int Position; typedef int ElemType; typedef int Status; int compare1=0,compare2=0,compare3=0,compare4=0,compare5=0,compare6=0;//比较次数 int move1 = 0, move2 = 0, move3 = 0, move4 = 0, move5 = 0, move6 = 0;//移动次数 ElemType*p, *q; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OK 1; #define TRUE 1; #define FALSE 0; #define ERROR 0; #define OVERFLOW -2; /*①SqList.h线性表的动态分配顺序存储结构*/ typedef struct { int key; }lkey; typedef struct { lkey *elem; int length; int listsize; }SqList; /*②顺序表基本操作接口定义*/ //操作结果:构造一个空的线性表 Status InitList_Sq(SqList &L); //操作结果:在L中第i个元素之前插入新的元素e,L的长度加1 Status ListInsert_Sq(SqList &L, int i, ElemType e); //操作结果:依次对L的每个数据元素调用(*visit)(),一旦(*visit)()失败,则操作失败 Status ListTraverse_Sq(SqList L, Status(*visit)(ElemType)); //将元素e的值打印出来 Status visit_sp(ElemType e); //直接插入排序 void InsertSort(SqList L); //希尔排序 void ShellSort(SqList L, int dlta[], int t); void Shell(SqList L, int dk);//一趟希尔插入排序 //起泡排序 void BubbleSort(SqList L); //快速排序 void QuickSort(SqList L); void Quick(SqList L, int low, int high); int QsortPartion(SqList L, int low, int high);//一趟快速排序 //简单选择排序 void SelectSort(SqList L); //堆排序 void HeapSort(SqList L); void HeapAdjust(SqList L, int s, int m);//建大顶堆函数 //随机生成数构造线性表 Status InitList_Sq(SqList &L) { int i; L.elem = (lkey*)malloc(LIST_INIT_SIZE * sizeof(lkey)); if (!L.elem)exit(-2); L.length = 0; L.listsize = LIST_INIT_SIZE; //srand((unsigned)time(NULL)); for (i = 1; i < 15; i++) { L.elem[i].key = rand() % 100 + 1; ListInsert_Sq(L, i, L.elem[i].key); } return OK; /*请参考课本上的算法2.3*/ } //在L中第i个元素之前插入新的元素e,L的长度加1 Status ListInsert_Sq(SqList &L, int i, ElemType e) { if (i<1 || i>L.length + 1) return ERROR; if (L.length >= L.listsize) { lkey*newbase = (lkey*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(lkey)); if (!newbase)return ERROR; L.elem = newbase; L.listsize += LISTINCREMENT; } q = &(L.elem[i - 1].key); for (p = &(L.elem[L.length - 1].key); p >= q; --p) *(p + 1) = *p; *q = e; ++L.length; return OK; /*请参考课本上的算法2.4*/ } //操作结果:依次对L的每个数据元素调用(*visit)(),一旦(*visit)()失败,则操作失败 Status ListTraverse_Sq(SqList L, Status(*visit)(ElemType)) { int i; for (i = 1; i <= L.length; i++) (*visit)(L.elem[i - 1].key); printf("\n"); return OK; } //将元素e的值打印出来 Status visit_sp(ElemType e) { printf("%d ", e); return OK; } //直接插入排序 void InsertSort(SqList L) { int compare1 = 0, move1 = 0; int i=0, j=0; lkey rc; for (i = 1; i<L.length; ++i)//从第二个开始 { compare1++; if (L.elem[i].key < L.elem[i - 1].key) { move1 += 2; rc = L.elem[i]; L.elem[i] = L.elem[i - 1]; for (j = i - 2; j >= 0 && rc.key < L.elem[j].key; --j)//从i-2个开始 { compare1++; L.elem[j + 1] = L.elem[j]; move1++; } L.elem[j + 1] = rc; move1 += 3; } } ListTraverse_Sq(L,visit_sp); printf("%d %d\n", compare1, move1); } //希尔排序 void ShellSort(SqList L, int dlta[], int t) { ListTraverse_Sq(L, visit_sp); int k; for (k = 0; k < t; k++) Shell(L, dlta[k]); ListTraverse_Sq(L, visit_sp); printf("%d %d\n", compare2, move2); } void Shell(SqList L, int dk)//一趟希尔插入排序 { lkey rc; int j; for (int i = dk; i < L.length; i++) { compare2++; if (L.elem[i].key < L.elem[i - dk].key)//比较i和i-dk { rc = L.elem[i]; move2++; for (j = i - dk; j >= 0 && (rc.key < L.elem[j].key); j -= dk)//[6]和[3],[0]比较 { compare2++; L.elem[j + dk] = L.elem[j];//记录后移,查找插入位置 move2++; } L.elem[j + dk] = rc;//插入 move2++; } } } int main() { SqList L; int i; int dita[3] = { 5,3,1 }, t = 3; for (i = 0; i <= 5; i++) { printf("当前随机数为:\n"); InitList_Sq(L); ListTraverse_Sq(L, visit_sp); InsertSort(L); ShellSort(L, dita, t); //BubbleSort(L); //QuickSort(L); //SelectSort(L); //HeapSort(L); /*printf("------|-比较次数-||-移动次数-|\n"); printf("Insert| %d || %d |\n", compare1, move1); printf("Shell | %d || %d |\n", compare2, move2); printf("Bubble| %d || %d |\n", compare3, move3); printf("Quick | %d || %d |\n", compare4, move4); printf("Select| %d || %d |\n", compare5, move5); printf("Heap | %d || %d |\n", compare6, move6);*/ } system("pause"); return 0; } ```
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
使用 Docker 部署 Spring Boot 项目
Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 S...
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
Android 9.0 init 启动流程
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、启动流程概述一、 启动流程概述Android启动流程跟Linux启动类似,大致分为如下五个阶段。1.开机上电,加载固化的ROM。2.加载BootLoader,拉起Android OS。3.加载Uboot,初始外设,引导Kernel启动等。...
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问