目录
1. 作为成员变量的类没有默认构造函数
2. 参考资料
1. 作为成员变量的类没有默认构造函数
如果成员变量中包含其他类的对象,并且这个类没有默认构造函数,这个时候,编译器就不能合成默认构造函数。案例如下:
//sales_data.h #ifndef SALES_DATA_H #define SALES_DATA_H #include#include using namespace std; class SalesData { public: SalesData(int sale_a):sale_isbn(sale_a) { } private: int sale_isbn = 0; }; #endif
//sales_man.h
#ifndef SALES_MAN_H
#define SALES_MAN_H
#include "sales_data.h"
//global variable
SalesData sale_init(0);
class SalesMan
{
private:
string sale_name;
SalesData m_data = sale_init;
};
#endif
//main.cpp #include#include "sales_data.h" #include "sales_man.h" int main() { std::cout << "SalesData totoal before..." << std::endl; SalesMan zhang_san; std::cout << "SalesData totoal after..." << std::endl; return 0; }
使用以下Makefile编译
TGT:= main SRC:= $(wildcard *.cpp) OBJ:= $(patsubst %cpp,%o,$(SRC)) CPPFLAGS := -I. all:$(TGT) >---@echo "Make successful [0]" $(TGT):$(OBJ) >---g++ $^ -o $@ %.o:%.cpp >---g++ $(CPPFLAGS) $< -c- clear: >---rm $(OBJ) $(TGT) log.log .PHONY: all clear
编译出错,如下
main.cpp: In function ‘int main()’:
main.cpp:9:14: error: use of deleted function ‘SalesMan::SalesMan()’
SalesMan zhang_san;
^~~~~~~~~
In file included from main.cpp:4:0:
sales_man.h:9:7: note: ‘SalesMan::SalesMan()’ is implicitly deleted because the default definition would be ill-formed:
class SalesMan
^~~~~~~~
sales_man.h:9:7: error: no matching function for call to ‘SalesData::SalesData()’
In file included from main.cpp:3:0:
sales_data.h:11:5: note: candidate: SalesData::SalesData(int)
SalesData(int sale_a):sale_isbn(sale_a)
^~~~~~~~~
sales_data.h:11:5: note: candidate expects 1 argument, 0 provided
sales_data.h:8:7: note: candidate: constexpr SalesData::SalesData(const SalesData&)
class SalesData
^~~~~~~~~
sales_data.h:8:7: note: candidate expects 1 argument, 0 provided
sales_data.h:8:7: note: candidate: constexpr SalesData::SalesData(SalesData&&)
sales_data.h:8:7: note: candidate expects 1 argument, 0 provided
make: *** [main.o] Error 1
这个时候我们必须自定义默认构造函数,否则,没有默认的构造函数可以用。
2. 参考资料
《C++ primer》第五版



